DECLARE CURSOR

指定した SELECT 文にカーソル名が関連付けられて、FETCH 文を使用してデータ行を取得できるようになります。

構文、形式 1:

>>--EXEC SQL---.------------.------DECLARE cursor_name------>
               +-AT db_name-+

 >--.-------------.-----.---------.------.--------------.--->
    +-SENSITIVE---+     +-FORWARD-+      +-LOCK---------+
    +-INSENSITIVE-+     +-KEYSET--+      +-LOCKCC-------+
                        +-DYNAMIC-+      +-OPTIMISTIC---+
                        +-STATIC--+      +-OPTCC--------+
                        +-SCROLL--+      +-OPTCCVAL-----+
                        +-DATASET-+      +-READ ONLY----+
                                         +-READONLY-----+
                                         +-FASTFORWARD--+
                                         +-FAST FORWARD-+

 >--CURSOR-------.----------------.---------FOR------------->
                 +----WITH HOLD---+

 >----.----select_stmt-----------------------.-------------->
      +----stored_procedure_call_statement---+
      +----prepared_stmt_name----------------+
      +----OPTIMIZE FOR n ROWS---------------+
 >--.-------------------------------.----------------------->
    +-FOR READ ONLY-----------------+
    +-FOR UPDATE-.----------------.-+
                 +-OF column_list-+
 >------END-EXEC--------><

構文、形式 2:

注: 書き方 2 は、SQL Server でのみ対応しています。
>>--EXEC SQL---.------------.------DECLARE cursor_name------>
               +-AT db_name-+
 >--CURSOR FOR---result-set-generating-dml-statement-------->

 >------END-EXEC--------><

パラメーター:

AT db_name DECLARE DATABASE を使用して宣言されたデータベースの名前。
注: DECLARE CURSOR で AT db_name を使用する必要がある場合、カーソルを参照する後続の文の接続が現在の接続と異なっていると、カーソルに関連付けられている接続に自動的に切り替わります。これは、この文の実行中のみ有効です。
cursor_name 後続の文でカーソルを識別するために使用するカーソル名。カーソル名には、ファイル名として使用できる文字を 30 字まで含められます。最初の文字は英字とします。
select_stmt 任意の有効な SQL SELECT 文、または結果セットを返すストアド プロシージャの QUERY ODBC 文か CALL 文。
prepared_stmt_name 準備された SQL SELECT 文または QUERY ODBC 文の名前。
stored_procedure_call_stmt 結果セットを返す有効なストアド プロシージャ呼び出し。
n カーソルが開いたときにフェッチされるブロックごとの行数。n の値は 1000 未満でなければなりません。
column_list カンマで区切られた列名のリスト。
result-set-generating-dml-statement OUTPUT 句を含む SQL Server INSERT、位置決めされていない UPDATE、または DELETE 文。

説明:

別々にコンパイルされた 2 つのプログラムでは、同じカーソルを共有できません。特定のカーソルを参照する文はすべて、まとめてコンパイルする必要があります。

DECLARE CURSOR 文は、最初のカーソル参照よりも前にする必要があります。SELECT 文は、カーソルが開いたときに実行されます。SELECT 文には次の規則が適用されます。

  • INTO 句またはパラメーター マーカーを含めることはできません。
  • 前に宣言節で指定した入力ホスト変数を含めることは可能です。
  • ODBC ドライバーによっては、位置指定更新または位置指定削除を実行する場合に、SELECT 文に FOR UPDATE 句を指定する必要があります。

OPTIMIZE FOR を指定すると、カーソルの PREFETCH 指令の設定が n を使用してオーバーライドされます。これにより、個々のカーソルで事前取り込みを最適化できます。

DECLARE CURSOR 文で複数の SELECT 文を指定することができます。これは、次のいずれかから複数の結果セットが返されることを示します。いずれの場合もクライアント アプリケーションで追加の結果セットを取得するには GET NEXT RESULT SET 文を使用する必要があります。
  • SQL Server 用 COBOL ストアド プロシージャ
  • 標準の OpenESQL アプリケーション プログラム
次の内容は、DECLARE CURSOR の特定のオプションの動作に当てはまります。
  • SCROLL では、ドライバーによってサポートされるスクロール オプションを選択します (FORWARD は除く)。
  • DATASET を使用すると、カーソルで任意の BEHAVIOR 設定を使用できます。DATASET は、他の .NET 言語との相互運用性のために基本的な .NET オブジェクトを使用するアプリケーションでは必須です。OpenESQL Managed Runtime でのみ使用できます。
  • LOCKCC と LOCK は等価です。
  • READ ONLY と READONLY は同義です。
  • OPTIMISTIC では、ドライバーによってサポートされるオプティミスティック同時実行モード (OPTCC または OPTCCVAL) を選択します。
  • HOLD カーソルが要求され、現在の接続がトランザクションの終わりで閉じている場合には、OPEN 文はエラー (SQLCODE = -19520) を返します。
  • データベースが Microsoft SQL Server で、NOANSI92 ENTRY 指令設定が使用されている場合 (この設定がデフォルト) は、Microsoft SQL Server 固有の ODBC 呼び出しが接続時に行われ、カーソルがトランザクションの終わりで閉じないように要求されます。この動作は、Micro Focus Embedded SQL Toolkit for Microsoft SQL Server と互換性があります。USECURLIB の設定は、YES にしないでください。
  • FAST FORWARD と FASTFORWARD は同義です。これは、FORWARD、READ-ONLY カーソルにのみ適用されるパフォーマンス最適化パラメーターです。これに加えて、AUTOFETCH 指令を使用してプログラムをコンパイルすると、パフォーマンスをさらに向上させることができます。この方法は、アプリケーションに結果セットを取り込む最も効率のよい方法です。AUTOFETCH 指令を使用すると、ネットワーク トラフィックを大幅に減少できる 2 つの最適化が有効になります。パフォーマンスが最も向上するのは、アプリケーションのメモリにキャッシュできるサイズの比較的小さい結果セットを使用してカーソルを処理する場合です。FASTFORWARD カーソルは、Microsoft SQL Server 2000 以降のサーバーでのみ使用できます。

例:

EXEC SQL DECLARE C1 CURSOR FOR
   SELECT last_name, first_name FROM staff
END-EXEC

EXEC SQL DECLARE C2 CURSOR FOR
   QUERY ODBC COLUMNS TABLENAME 'staff'
END-EXEC