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

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

巴扎黑
巴扎黑オリジナル
2017-05-18 14:35:122034ブラウズ

カーソル データの使用

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

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

入力:

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 という名前のファイルにコピーします。取得したデータには処理は実行されません。

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

入力:

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に設定するにはどうすればよいでしょうか?答えは、次のステートメントを使用することです:

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 ステートメントの構文はカーソルでのループにより適しています。

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

入力:

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 ステートメントで表示できる別のテーブルを作成して設定することができます。

入力:

select * from ordertotals;

出力:

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

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

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。