OPEN

構文
>>--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 文を参照するカーソルとのみ使用します。
目的

OPEN 文では、対応する DECLARE CURSOR 文で指定された SELECT 文が実行され、結果集合が生成されます。この結果集合は、FETCH 文によって一度に 1 行ずつアクセスされます。

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

カーソルが動的 SELECT 文 (つまり、準備された文) によって宣言された場合は、SELECT 文にパラメータマーカーを含めることはできますが、ホスト変数を含めることはできません。 パラメータマーカーは SELECT 文の中で列値が許可されている場所であればどこでも使用できます。 SELECT 文にパラメータマーカーがある場合は、ホスト変数と同数の USING :hvar オプション、または、アプリケーションによってすでにポピュレートされた SQLDA データ構造体を示す USING DESCRIPTOR :sqlda_struct オプションを OPEN 文に指定する必要があります。

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

SELECT 文のパラメータマーカーの数は、sqldata 項目 (USING DESCRIPTOR :sqlda_struct) の数、または、OPEN 文のホスト変数 (SUSING :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
他参照:

関連項目