カーソル

1. 宣言用カーソル
2. カーソルOPENステートメント
3. カーソルFETCHステートメント
4. カーソル CLOSE ステートメント

ストアドプロシージャとファンクションの内側に単純なカーソルがサポートされています。その構文は埋め込まれているSQLの中のものと同じです。.カーソルは現在、アセンシティブ、読み取り専用、そしてスクロール機能はついていません。アセンシテブはサーバがその結果テーブルの複製を作ることができるか、できないとを意味します。

カーソルは、ハンドラを宣言する前に宣言されなければなりません。また、変数と条件はカーソルかハンドラのいずれかを宣言する前に宣言されなければなりません。

例:

CREATE PROCEDURE curdemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE a CHAR(16);
  DECLARE b,c INT;
  DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;

  OPEN cur1;
  OPEN cur2;

  REPEAT
    FETCH cur1 INTO a, b;
    FETCH cur2 INTO c;
    IF NOT done THEN
       IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
       ELSE
          INSERT INTO test.t3 VALUES (a,c);
       END IF;
    END IF;
  UNTIL done END REPEAT;

  CLOSE cur1;
  CLOSE cur2;
END

1. 宣言用カーソル

DECLARE cursor_name CURSOR FOR select_statement

このステートメントはカーソルを宣言します。複数のカーソルを一つのルーチンの中に宣言することができますが、各カーソルは附与されたブロックの中に、ユニークな名称を持っていなければなりません。

SELECTステートメントにINTO節を含めることはできません。

2. カーソルOPENステートメント

OPEN cursor_name

このステートメントは以前に宣言したカーソルを開きます。

3. カーソルFETCHステートメント

FETCH cursor_name INTO var_name [, var_name] ...

このステートメントは、規定されたオープンカーソルを使って、次の行(存在している場合)を取り込んで、ここにカーソルポインタを進めます。

行が得られなくなると、SQLSTATE値02000を使用したNo Data条件が発生します。この条件を検出するため、ハンドラをセットすることができます。例が項 「カーソル」で紹介されています。

4. カーソル CLOSE ステートメント

CLOSE cursor_name

このステートメントは以前開いたカーソルを閉じます。

明らかに閉じていない場合、それは、それが宣言された複合ステートメントの最後で閉じられます。