カーソル述部

カーソル述部は、現行の有効範囲内に定義されたカーソルの状態を調べるために使用する SQL キーワードです。 これを使用して、カーソルがオープンされたか、クローズされたか、またはカーソルによって処理されている行があるかどうかを簡単に参照できます。

構文図を読む構文図をスキップするcursor-variable-nameISNOT FOUNDOPEN
cursor-variable-name
カーソル・タイプの SQL 変数または SQL パラメーターの名前。
IS
カーソル述部のプロパティーを検査することを指定します。
NOT
カーソル述部のプロパティーを検査する対向値を戻すことを指定します。
FOUND
カーソルが、FETCH ステートメントの実行後に行を保有しているかどうかを検査することを指定します。最後の FETCH ステートメントが成功していた場合に、IS FOUND 述部の構文が使用されると、戻り値は TRUE となります。最後に実行された FETCH ステートメントの結果、行が存在しなかった場合、戻される値は FALSE となります。以下にあてはまる場合、戻り値は不明です。
  • cursor-variable-name 値が NULL である
  • cursor-variable-name の基礎カーソルがオープンされていない
  • 基礎カーソル上で最初の FETCH 操作が実行される前に、述部が評価された
  • 最後の FETCH 操作でエラーが戻された
IS FOUND 述部は、ループ内でフェッチの実行を反復する SQL PL ロジック部分に有用です。この述部は、フェッチする残りの行があるかどうかを調べるためにも使用できます。フェッチする残りの行がないというエラー条件を検査する条件処理ルーチンの代わりとなる効果的な選択肢です。

NOT キーワードが指定されて、構文が IS NOT FOUND となる場合、結果の値は反対になります。

OPEN
カーソルがオープン状態かどうかを検査することを指定します。カーソルがオープンされている場合に、OPEN 述部の構文が使用されると、戻り値は TRUE となります。カーソルがパラメーターとして関数およびプロシージャーに渡されるときに有効な述部です。カーソルのオープンを試行する前に、この述部を使用してカーソルが既にオープンされていないかどうかを調べることができます。

NOT キーワードが指定されて、構文が IS NOT OPEN となる場合、結果の値は反対になります。

  • カーソル述部は、コンパウンド SQL (コンパイル済み) ステートメント内のステートメントのみで使用できます (SQLSTATE 42818)。

以下のスクリプトは、プロシージャーのコンパイルおよび呼び出しを成功させるために必要な前提条件オブジェクトを定義し、さらに、カーソル述部の参照を行う SQL プロシージャーを定義します。
CREATE TABLE T1 (c1 INT, c2 INT, c3 INT)@

INSERT INTO T1 VALUES (1,1,1),(2,2,2),(3,3,3) @

CREATE TYPE myRowType AS ROW(c1 INT, c2 INT, c3 INT)@

CREATE TYPE myCursorType AS myRowType CURSOR@


CREATE PROCEDURE p(OUT count INT)
LANGUAGE SQL
BEGIN
  DECLARE C1 CURSOR;
  DECLARE lvarInt INT;

  SET count = -1;
  SET c1 = CURSOR FOR SELECT c1 FROM t1;

  IF (c1 IS NOT OPEN) THEN
     OPEN c1;
  ELSE 
     set count = -2;
  END IF;

  SET count = 0;
  IF (c1 IS OPEN) THEN 
  
    FETCH c1 INTO lvarInt;

    WHILE (c1 IS FOUND) DO
      SET count = count + 1;
      FETCH c1 INTO lvarInt;
    END WHILE;
  ELSE
     SET COUNT = 0;
  END IF;

END@

CALL p()@