MySQLカーソル

2923 ワード

1.簡単な紹介
MySQL 5からカーソルのサポートが追加され、カーソルを使用すると、クエリの結果セットで最初のロー、最後のロー、前のロー、次のローなどの一連の操作を簡単に取得できます.
カーソルはMySQLサーバに格納されたデータベースクエリであり、SELECT文ではなく、その文によって取得された結果セットです.カーソルが格納された後、アプリケーションは必要に応じてデータをスクロールまたは参照できます.
MySQLカーソルは、ストアド・プロシージャおよび関数でのみ使用できます.
2.カーソルの定義と使用
2.1カーソルの宣言
DECLARE cursor_name CURSOR FOR select_statement;

select_statementの結果セットは、現在定義されているカーソルに対応します.【注意】
この時点ではまだデータの取得が開始されていません.select_statementにINTO句はありません.
2.2カーソルを開く
OPEN cursor_name;

カーソルを定義した後、「OPEN」キーを使用してカーソルを開くと、結果セットが得られるクエリが実行されます.
デフォルトでは、カーソルのポインタは、最初は結果セットの最初のローを指します.
2.3カーソルの使用
FETCH cursor_name INTO var_name [, var_name] ...

FETCHキーとINTOキーを使用して、現在のカーソルが指すレコードのフィールド値を定義した変数に割り当てます.
「FETCH」文を実行するたびに、ポインタは1行下に移動します.
select_statement結果セットのフィールド数(列数)は、INTOの後の変数と一致する必要があります.そうしないと、エラーが発生します.
2.4カーソルを閉じる
CLOSE cursor_name;

CLOSEは、カーソルが使用するすべての内部メモリとリソースを解放します.
カーソルが明示的に閉じられていない場合、カーソルは宣言された複合文の末尾(END)で自動的に閉じられます.
「OPEN」を使用してカーソルを再度開かない限り、カーソルが閉じた後は使用を続行できません.
ストレージ・プロシージャが終了すると、カーソルは消えます.
3.循環カーソル
カーソルは通常、ループ文と組み合わせて使用されます.そうしないと意味がありません.循環カーソルには3つの方法があります.
3.1 LOOP文
-- LOOP    
[begin_label:] LOOP
    statement_list
END LOOP [end_label];

-- LOOP       LEAVE  ,      
[begin_label:] LOOP
    statement
    IF [condition] THEN
        LEAVE [label];    --         
    END IF;
    statement
END LOOP [end_label];

「begin_label」は、(名前のカスタマイズ)を指定する必要があります.「LEAVE」の後の「label」も指定しなければならず、名前は「begin_label」と同じでなければならない.「end_label」は、指定しても指定しなくてもよく、指定した場合は「begin_label」と同じでなければなりません.
複数のLOOP文が同じカーソル内にある場合(つまり、複数のLOOP文の間でカーソルが閉じられて開かれていない場合)、次のLOOP文のカーソルのポインタは、最初のローよりも前に進むのではなく、下に進むのです.
3.2 REPEAT文
-- REPEAT    
[begin_label:] REPEAT
    statement_list
UNTIL
    condition
END REPEAT [end_label];

条件「condition」が成立すると、現在のループから飛び出します.
「begin_label」と 「end_label」はいずれも指定できますが、指定した場合は指定しません. 「end_label」を指定する必要があります 「begin_label」は同じです.
3.3 WHILE文
[begin_label:] WHILE condition DO
    statement_list
END WHILE [end_label];

条件「condition」が成立しない場合、現在のループを終了します.
「begin_label」と 「end_label」はいずれも指定できますが、指定した場合は指定しません. 「end_label」を指定する必要があります 「begin_label」は同じです.
4.カーソルオーバーフロー
カーソルを循環すると、カーソル自体は最後のデータに到達したかどうかを監視しません.カーソルが最後のローを指している間に実行を続行すると、カーソルがオーバーフローします.
カーソルがオーバーフローすると、MySQLの事前定義された「NOT FOUND」(SQLSTATE'02000')エラーが発生します.
以下に、WHILEサイクルを一例とする.
DECLARE done INT DEFAULT true;	--     
DECLARE cursor_name CURSOR FOR select_statement; --     
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = false; --     
--  : DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = FALSE;
WHILE done DO
    FETCH cursor_name INTO var_name [, var_name] ...
END WHILE;

【注意】
オーバーフロー処理は、カーソル宣言後に定義する必要があります.