Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 文 » SQL 文 (A ~ D)

 

DECLARE CURSOR 文 [ESQL] [SP]

この文は、カーソルを宣言するために使用します。カーソルはクエリの結果を操作する主要な手段です。

構文 1 [ESQL]
DECLARE cursor-name
[ UNIQUE ]
[   NO SCROLL
  | DYNAMIC SCROLL
  | SCROLL
  | INSENSITIVE
  | SENSITIVE
]
CURSOR FOR
{ select-statement
| statement-name [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ]
| call-statement }
構文 2 [SP]
DECLARE cursor-name
[   NO SCROLL
  | DYNAMIC SCROLL
  | SCROLL
  | INSENSITIVE
  | SENSITIVE
]
CURSOR
{ FOR  select-statement [ FOR { UPDATE [ cursor-concurrency ] | READ ONLY } ]
| FOR call-statement
| USING variable-name }
cursor-name :  identifier
statement-name :  identifier | hostvar
variable-name :  identifier
cursor-concurrency :
BY { VALUES | TIMESTAMP | LOCK }
パラメータ
  • UNIQUE 句   カーソルが UNIQUE として宣言されている場合、クエリは各ローをユニークに識別するのに必要なすべてのカラムを強制的に返します。このため、プライマリ・キーまたはユニークなテーブル制約内のカラムのすべてが、確実に返ることになります。必須であってもクエリに指定されていなかったカラムは、結果セットに追加されます。

    UNIQUE カーソル上で実行された DESCRIBE は、インジケータ変数の中に次の追加のオプションを設定します。

    • DT_KEY_COLUMN   カラムはローに対するキーの一部です。

    • DT_HIDDEN_COLUMN   カラムがクエリに追加されました。カラムはローをユニークに識別するために必要です。

  • NO SCROLL 句   NOSCROLL として宣言されたカーソルは、FETCHNEXT と FETCHRELATIVE0 の各シーク操作を使用して、結果セットの前方移動に制限されます。

    カーソルがローを出た後は、そのローに戻ることができないため、カーソルに sensitivity の制限はありません。NO SCROLL カーソルが要求されると、SQL Anywhere は最も効率的なカーソルである asensitive カーソルを提供します。asensitive カーソルを参照してください。

  • DYNAMIC SCROLL 句   DYNAMIC SCROLL はデフォルト・カーソル・タイプです。DYNAMIC SCROLL カーソルでは、FETCH 文のすべてのフォーマットを使用できます。

    DYNAMIC SCROLL カーソルを要求されると、SQL Anywhere は asensitive カーソルを提供します。カーソルを使用する場合、効率と一貫性の間には常にトレードオフ関係があります。Asensitive カーソルを使用すると、パフォーマンスは向上しますが一貫性が低下します。asensitive カーソルを参照してください。

  • SCROLL 句   SCROLL として宣言されたカーソルは、FETCH 文のすべてのフォーマットを使用できます。SCROLL カーソルを要求されると、SQL Anywhere は value-sensitive カーソルを提供します。value-sensitive カーソルを参照してください。

    SQL Anywhere は、結果セットのメンバシップが保証されるような方法で value-sensitive カーソルを実行します。DYNAMIC SCROLL カーソルの方が効率的です。SCROLL カーソルの一貫した動作が必要でない場合は、DYNAMIC SCROLL カーソルを使用してください。

  • INSENSITIVE 句   INSENSITIVE として宣言されたカーソルには、それを開いたときに決定されるメンバシップがあります。テンポラリ・テーブルは、すべてのオリジナル・ローのコピーから作成されます。INSENSITIVE カーソルからの FETCHING は、他の INSERT、UPDATE、または DELETE 文の効果を参照しません。または別のカーソル上の他の PUT、UPDATE WHERE CURRENT、DELETE WHERE CURRENT オペレーションを参照しません。INSENSITIVE カーソルからの FETCHING は、同じカーソル上の PUT、UPDATE WHERE CURRENT、DELETE WHERE CURRENT オペレーションの効果を参照します。insensitive カーソルを参照してください。

  • SENSITIVE 句   SENSITIVE として宣言されたカーソルは、結果セットのメンバシップまたは値の変更に依存します。sensitive カーソルを参照してください。

  • FOR statement-name   PREPARE 文を使用して文に名前を付けます。作成された SELECT または CALL のためにだけカーソルを宣言できます。

  • FOR UPDATE | READ ONLY   FOR READ ONLY として宣言されたカーソルは UPDATE (位置付け) 操作や DELETE (位置付け) 操作には使用できません。FOR UPDATE はデフォルトです。

    ORDER BY 句なしの単一テーブルのクエリの場合、または ansi_update_constraints オプションが Off に設定されている場合、カーソルのデフォルトは FOR UPDATE です。ansi_update_constraints オプションが Cursors または Strict に設定されている場合、ORDER BY 句を含むクエリ上のカーソルのデフォルトは READ ONLY です。ただし、FOR UPDATE 句を使用して、カーソルを更新可能と明示的に示すこともできます。ORDER BY 句またはジョインを使用してカーソルに対する更新を可能にするにはコストがかかるため、2 つ以上のテーブルのジョインを含むクエリに対するカーソルは READ ONLY であり、更新可能にすることはできません。

    FOR UPDATE を指定したカーソル要求への応答では、SQL Anywhere は value-sensitive カーソルまたは sensitive カーソルを提供します。insensitive カーソルと asensitive カーソルは更新できません。

  • USING variable-name   ストアド・プロシージャの内部でのみ使用します。この変数はカーソルの SELECT 文を含む文字列です。この変数は DECLARE を処理するときに使用するため、次のいずれかの方法で指定します。

    プロシージャへのパラメータ。次に例を示します。

    CREATE FUNCTION GetRowCount( IN qry LONG VARCHAR)
    RETURNS INT
    BEGIN
      DECLARE crsr CURSOR USING qry;
      DECLARE rowcnt INT;
    
      SET rowcnt = 0;
      OPEN crsr;
      lp: LOOP
        fetch crsr;
        IF SQLCODE <> 0 THEN LEAVE lp END IF;
        SET rowcnt = rowcnt + 1;
      END LOOP;
      RETURN rowcnt;
    END;

    この変数に値を割り当ててから、別の BEGIN... END 内にネストします。次に例を示します。

    CREATE PROCEDURE get_table_name(
      IN id_value INT, OUT tabname CHAR(128)
    )
    BEGIN
      DECLARE qry LONG VARCHAR;
    
      SET qry = 'SELECT table_name FROM SYS.SYSTAB ' ||
                'WHERE table_id=' || string(id_value);
      BEGIN
        DECLARE crsr CURSOR USING qry;
        OPEN crsr;
        FETCH crsr INTO tabname;
        CLOSE crsr;
      END
    END;

  • BY VALUES | TIMESTAMP | LOCK 句   Embedded SQL では、SELECT 文内またはカーソル宣言内に構文を含めることで、同時実行性の仕様を設定できます。ペシミスティックまたはオプティミスティックの同時実行性をカーソル・レベルに選択できます。このとき、DECLARE CURSOR 文または FOR 文を使用したオプション、または同時実行性を設定する特定のプログラミング・インタフェースの API が使用されます。文が更新可能で、カーソルが特定の同時制御メカニズムを指定しない場合、文の指定が使用されます。構文は次のとおりです。

  • FOR UPDATE BY LOCK 句   データベース・サーバは、FETCH した結果セットのローに対して、意図的なロー・ロックをかけます。このロックは長期間のロックであり、トランザクションが COMMIT または ROLLBACK されるまで保持されます。

  • FOR UPDATE BY { VALUES | TIMESTAMP }   データベース・サーバは、keyset-driven カーソルを利用して、結果セットをスクロールするときにローが変更または削除されたときにアプリケーションへ通知できるようにします。

備考

DECLARE CURSOR 文は、SELECT 文または CALL 文に対して指定された名前を持つカーソルを宣言します。Watcom-SQL のプロシージャ、トリガ、またはバッチの場合、DECLARE CURSOR 文は、BEGIN キーワードの直後に、他の宣言とともに指定する必要があります。また、カーソル名をユニークにする必要があります。

カーソルが複合文内で宣言される場合、(Watcom-SQL または Transact-SQL 複合文での宣言にかかわらず) その複合文の間だけ存在します。

パーミッション

なし

関連する動作

なし

参照
標準と互換性
  • SQL/2003   コア機能。

次の例は、Embedded SQL 内のスクロール・カーソルを宣言する方法を示します。

EXEC SQL DECLARE cur_employee SCROLL CURSOR
FOR SELECT * FROM Employees;

次の例は、Embedded SQL 内の準備文のためのカーソルを宣言する方法を示します。

EXEC SQL PREPARE employee_statement
FROM 'SELECT Surname FROM Employees';
EXEC SQL DECLARE cur_employee CURSOR
FOR employee_statement;

次の例は、ストアド・プロシージャのカーソルの使用方法を示します。

BEGIN
  DECLARE cur_employee CURSOR FOR
      SELECT Surname
      FROM Employees;
  DECLARE name CHAR(40);
  OPEN cur_employee;
  lp: LOOP
    FETCH NEXT cur_employee INTO name;
    IF SQLCODE <> 0 THEN LEAVE lp END IF;
    ...
  END LOOP;
  CLOSE cur_employee;
END