ホームページ > データベース > mysql チュートリアル > MySQL のカーソル データを使用したサンプル チュートリアル

MySQL のカーソル データを使用したサンプル チュートリアル

巴扎黑
リリース: 2017-05-18 14:35:12
オリジナル
2112 人が閲覧しました

カーソル データの使用

カーソルを開いた後、FETCH ステートメントを使用してカーソルの各行に個別にアクセスできます。 FETCH は、取得するデータ (必須列) と、取得したデータの保存場所を指定します。また、次の FETCH ステートメントで (同じ行を繰り返し読み取らずに) 次の行を取得できるように、カーソル内の内部行ポインタを前方に移動します。

最初の例は、カーソルから 1 つの行 (最初の行) を取得します:

入力:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

create procedure processorders()

BEGIN

-- declare local variables

declare o int;

-- declare the cursor

declare ordernumbers cursor

for

select order_num from orders:

-- open the cursor

open ordernumbers;

-- get order number

fetch ordernumbers into o;

-- close the cursor

close ordernumbers;

end;

ログイン後にコピー

分析: ここで、FETCH を使用して現在の行の order_num 列を取得します (最初の行から自動的に開始されます)。ローカルで宣言された変数 o の In という名前のファイルにコピーします。取得したデータには処理は実行されません。

次の例では、ループして最初の行から最後の行までデータを取得します。

入力:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

create procedure processorders()

BEGIN

-- declare local variables

declare done boolean default 0;

declare o int;

-- declare the cursor

declare ordernumbers cursor

for

select order_num from orders:

--declare continue handler

declare continue handler for sqlstate '02000' set done = 1;

-- open the cursor

open ordernumbers;

--loop through all rows

repeat

-- get order number

fetch ordernumbers into o;

-- end of loop

until done end repeat;

-- close the cursor

close ordernumbers;

end;

ログイン後にコピー

分析: 前の例と同様に、この例は FETCH を使用して、現在の order_num を宣言された変数に取得します。ああ。ただし、前の例とは異なり、この例の FETCH は REPEAT 内にあるため、done が true (UNTILdone END REPEAT; で指定) になるまで繰り返し実行されます。これを機能させるには、変数 Done を DEFAULT 0 (false、未完了) で定義します。では、最後にdoneをtrueに設定するにはどうすればよいでしょうか?答えは、次のステートメントを使用することです:

1

declare continue handler for sqlstate '02000' set done = 1;

ログイン後にコピー

このステートメントは、条件が発生したときに実行されるコードである CONTINUE HANDLER を定義します。ここでは、SQLSTATE '02000' が発生すると、SET Done=1 になることが示されています。 SQLSTATE '02000' は、ループをループする行がもうないために REPEAT を続行できない場合に発生する、見つからない条件です。

MySQL エラー コード MySQL 5 で使用される MySQL エラー コードのリストについては、http://dev.mysql.com/doc/mysql/en/error-handling.html を参照してください。

DECLARE ステートメントの順序 DECLARE ステートメントの発行には特定の順序があります。 DECLARE ステートメントで定義されたローカル変数は、カーソルまたはハンドルを定義する前に定義する必要があり、ハンドルはカーソルの後に定義する必要があります。この順序を守らないと、エラー メッセージが生成されます。

このストアド プロシージャを呼び出すと、いくつかの変数と CONTINUE HANDLER が定義され、カーソルを定義して開き、すべての行を繰り返し読み取り、カーソルを閉じます。すべてが正常であれば、必要な処理をループ内 (FETCH ステートメントの後、ループの終了前) に入れることができます。

繰り返しまたはループ? ここで使用されている REPEAT ステートメントに加えて、MySQL はループ ステートメントもサポートしています。これを使用すると、LEAVE ステートメントを使用して手動で終了するまでコードを繰り返し実行できます。通常、REPEAT ステートメントの構文はカーソルでのループにより適しています。

これを整理するために、カーソル ストアド プロシージャの例をさらに修正したバージョンを次に示します。今回は、取得したデータを実際に処理しています。

入力:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

create procedure processorders()

BEGIN

-- declare local variables

declare done boolean default 0;

declare o int;

declare t decimal(8,2);

-- declare the cursor

declare ordernumbers cursor

for

select order_num from orders;

-- declare continue handler

declare continue handler for sqlstate '02000' set done = 1;

-- create a table to store the results

create table if not exists ordertotals

(order_num int, total decimal(8,2));

-- open the cursor

open ordernumbers;

-- loop through all rows

repeat

-- get order number

fetch ordernumbers into o;

-- get the total for this order

call ordertotal(o,1,t);

-- insert order and total into ordertotals

insert into ordertotals(order_num,total)

values(o,t);

-- end of loop

until done end repeat;

-- close the cursor

close ordernumbers;

END;

ログイン後にコピー

分析: この例では、という別の変数を追加します。 t (各注文の合計を保存します)。このストアド プロシージャは、 ordertotals という名前の新しいテーブルも (まだ存在しない場合は) オンザフライで作成します。このテーブルには、ストアド プロシージャによって生成された結果が保持されます。 FETCH は前と同様に各 order_num を取得し、次に CALL を使用して別のストアド プロシージャ (前の章で作成した) を実行し、各注文の課税合計を計算します (結果は t に保存されます)。最後に、INSERT を使用して、各注文の注文番号と合計を保存します。

このストアド プロシージャはデータを返しませんが、単純な SELECT ステートメントで表示できる別のテーブルを作成して設定することができます。

入力:

1

select * from ordertotals;

ログイン後にコピー
出力:

MySQL のカーソル データを使用したサンプル チュートリアル

ストアド プロシージャ、カーソル、行ごとの処理、および他のストアド プロシージャを呼び出すストアド プロシージャの完全な動作例。

以上がMySQL のカーソル データを使用したサンプル チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート