カーソル データの使用
カーソルを開いた後、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 のカーソル データを使用したサンプル チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。