SQLプログラミングカーソル

3312 ワード

カーソル(Cursor)はC言語ポインタのような構造で、MySQLでは行セット全体ではなく、ユーザーが個別のデータ行にアクセスできるようにするデータアクセスメカニズムです.
MySQLでは、カーソルは主にカーソル結果セットとカーソル位置の2つの部分を含み、カーソル結果セットはカーソルを定義するSELECT文によってローを返す集合であり、カーソル位置はこの結果セットのローのポインタである.
カーソルを使用する前に、カーソルを宣言し、カーソルのスクロール動作やカーソルが操作する結果セットを生成するクエリなどのSQLサーバカーソルのプロパティを定義します.
カーソルの宣言:
select cursor_name cursor for select_statement;

例:teacherテーブルにt_という名前のテーブルを作成するcursorの通常カーソル
declare t_cursor cursor for select tno,tname from teacher;

カーソルを宣言すると、カーソルを操作できます.主に、カーソルのオープン、カーソルの取得、カーソルのクローズ、およびカーソルの解放が含まれます.
一、カーソルを開く
カーソルを使用する前に、カーソルを開く必要があります.カーソルを開く構文は次のとおりです.
open cuesor_name;

二、検索カーソル
カーソルを開くと、カーソル抽出データを開くことができます.FETCH文の機能は、カーソルの現在のポインタのレコードを取得し、指定した変数のリストに渡すことです.変数の数はMySQLカーソルが返すフィールドの数と一致する必要があります.より多くのローデータを取得するには、次のような構文でFETCHを実行するには、ループ文を使用します.
FETCH cursor_name INTO var1[,var2,...];

ただし、var 1[,var 2,...]変数のリストです.これらの変数は宣言する前に定義する必要があります.前述したように、カーソルはポインタ付きレコードセットであり、ポインタはレコード内の特定のレコードを指す.FETCH文の上記の定義から、FETCHはこの記録ポインタを移動するために使用されることが分かる.
MySQLのポインタは、前に読むだけで、つまり、結果セットを最初から後に読むしかなく、後ろから前に進むことも、真ん中のレコードに直接ジャンプすることもできません.
まず,FETCHはループ文から離れられない.一般的にLoopとwhileを使うのがはっきりしていて、コードが簡単です.ここでLoopを例にとると,コードは以下のようになる.
fetchloop:Loop
    FETCH T_Cursor INTO v_tno, v_tname;
end Loop;

上記サイクルはデッドサイクルであり,脱退条件はない.SQLやOracleとは異なり、MySQLはErrorhandlerの声明で判断されます.
declare continue handler for not found ...; 

MySQLでは、カーソルがオーバーフローしたときに、あらかじめ定義されたNOT FOUNDのエラー(SQLSTATE'02000')が発生し、読者がこのエラーを処理したときに実行を続行するエラーハンドラを定義すればよい.プロセッサを定義するときにフラグを定義し,ループ文でこのフラグをループ終了の判断条件とすればよい.
create procedure procursor()
begin
declare done int default 0;
declare v_tno varchar(4) default "";
declare v_tname varchar(8) default "";
declare T_cursor cursor for select TNO, Tname from teacher;  --    
declare continue handler for NOT FOUND done = 1;  --       
set done = 0;
open T_cursor;  --     
fetch_Loop:LOOP
fetch T_cursor into v_tno, v_tname;  --     
if done=1 then
    leave fetch_Loop;
else
    select v_tno,v_tname;
end if;
end loop fetch_Loop;
end

上記の文の変数doneはFETCH操作の終了情報を保持している.値がゼロの場合、レコード検索に成功したことを示します.そうでない場合、FETCH文は何らかの理由で動作に失敗します.
三、カーソルを閉じる
カーソルを開くと、MySQLサーバはカーソルのために特定のメモリ領域を開き、カーソル操作のデータ結果セットを格納します.また、カーソルの使用は状況に応じてブロックされます.したがって、カーソルを使用しない場合は、カーソルを閉じて、サーバにカーソルが使用するリソースを解放するように通知する必要があります.
カーソルが閉じた後、再オープンしていない場合は使用できません.ただし、宣言されたカーソルを使用して再宣言する必要はありません.カーソルを明示的に閉じない場合、MySQLはEND文に達すると自動的に閉じます.
カーソルを閉じる具体的な構文は次のとおりです.
CLOSE cursor_name;

取得カーソルT_cursorの後は、次の構文で閉じることができます.
close T_cursor;

以上の操作により、カーソルT_cursorの宣言、開く、取得、閉じる操作.終わりだ!