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