OPEN

対応する DECLARE CURSOR 文で指定した SELECT 文を実行し、FETCH 文が一度に 1 行ずつアクセスする結果セットを生成します。

構文:

>>--EXEC SQL---OPEN---cursor_name------------------------>

 >----.--------------------------------.----END-EXEC-----><
      +-USING DESCRIPTOR :sqlda_struct-+
      |       +- , -+                  |
      |       V     |                  |
      +-USING :hvar--------------------+     

パラメーター:

cursor_name 事前に宣言済みのカーソル。
:sqlda_struct アプリケーションによって事前に構築された SQLDA データ構造。SQLDA データ構造には、各入力パラメーターのアドレス、データ型、および長さが含まれます。このオプションは、DECLARE 文で準備済みの SQL 文を参照するカーソルと併用する場合にのみ使用します。コロンを使用すると、他の埋め込み SQL 実装との互換性を確保できます。
:hvar SELECT 文のパラメーター マーカーに対応する 1 つ以上の入力ホスト変数。このオプションは、DECLARE 文で準備済みの SQL 文を参照するカーソルと併用する場合にのみ使用します。

説明:

カーソルを静的な (準備されていない) SELECT 文で宣言する場合、SELECT 文にはホスト変数を含められますが、パラメーター マーカーを含めることはできません。ホスト変数の現在の値が OPEN 文の実行時に置き換えられます。静的に宣言されたカーソルについては、OPEN 文に USING :hvar または USING DESCRIPTOR :sqlda_struct オプションを含めることはできません。

カーソルを動的な (準備済みの) SELECT 文で宣言する場合、SELECT 文にはパラメーター マーカーを含められますが、ホスト変数を含めることはできません。パラメーター マーカーは、SELECT 文で列の値を使用できる任意の場所に記述できます。SELECT 文にパラメーター マーカーがある場合は、OPEN 文に、ホスト変数と同数の USING :hvar オプション、またはアプリケーションによってデータを書き込み済みの SQLDA データ構造を示す USING DESCRIPTOR :sqlda_struct オプションのどちらかを含める必要があります。

USING DESCRIPTOR :sqlda_struct オプションでは、プログラム変数の値は SELECT 文のパラメーター マーカーに置き換えられます。これらのプログラム変数は、SQLDA データ構造内の対応する SQLDATA 項目によってアドレス指定されます。

SELECT 文のパラメーター マーカーの数は、sqldata 項目 (USING DESCRIPTOR :sqlda_struct) または OPEN 文のホスト変数 (USING :hvar) の数と一致している必要があります。

例:

*Declare the cursor...
     EXEC SQL
     DECLARE C1 CURSOR FOR
        SELECT staff_id, last_name
        FROM staff
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not declare cursor.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT ALL END-EXEC
        STOP RUN
     END-IF

     EXEC SQL
        OPEN C1
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not open cursor.'
        DISPLAY SQLERRMC    
        DISPLAY SQLERRML
        EXEC SQL DISCONNECT CURRENT END-EXEC
        STOP RUN
     END-IF

     PERFORM UNTIL sqlcode NOT = ZERO
*SQLCODE will be zero as long as it has successfully fetched data
        EXEC SQL
           FETCH C1 INTO :staff-staff-id, :staff-last-name
        END-EXEC
        IF SQLCODE = ZERO
          DISPLAY "Staff ID: " staff-staff-id
           DISPLAY "Staff member's last name: " staff-last-name
        END-IF
     END-PERFORM

     EXEC SQL
        CLOSE C1
     END-EXEC

     IF SQLCODE NOT = ZERO
        DISPLAY 'Error: Could not close cursor.'
        DISPLAY SQLERRMC
        DISPLAY SQLERRML
     END-IF