>>--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