>>--EXEC SQL--.-------------------.-----------> +-FOR :host_integer-+ >-FETCH-------.-------------.------cursor_name-----------> +---PREVIOUS--+ +---LAST------+ +---PRIOR-----+ +---FIRST-----+ +---NEXT------+ >--.--------------------------------.---END-EXEC--->< +-USING DESCRIPTOR :sqlda_struct-+ | +- , -+ | | V | | +-INTO :hvar---------------------+
:host_integer | 処理されるホスト配列要素の最大数を指定するホスト変数を指定します。PIC S9(4) COMP-5 で宣言する必要があります。 |
cursor_name | 前に宣言して開いたカーソルを指定します。 |
:sqlda_struct | 前に DESCRIBE によって書き込まれ、出力値のアドレスが入っている SQLDA データ構造を指定するホスト変数を指定します。 このオプションは、準備された SELECT 文によって宣言されたカーソルと一緒に使用する場合に限り有効です。 (SELECT 文は、PREPARE 文を使って準備されます。) その他の埋め込み SQL 実装との互換性を保つためにコロンを使用できます。 |
:hvar | データを受け取る 1 つまたは複数のホスト変数を指定します。 |
FETCH 文により、カーソルの結果セットから行が検索され、その行にある列の値が対応するホスト変数 (または SQLDA データ構造で指定されたアドレス) に書き込まれます。 デフォルトでは、FETCH 文により次の行が検索されますが、前の行、最後の行、前の行よりも優先する行、または最初の行も指定できます。 これ以上フェッチする行がない場合は、SQLCODE が 100、SQLSTATE が "02000" に設定されます。
OPEN cursor_name 文は FETCH 文より前にあり、カーソルは FETCH の実行中に開いておく必要があります。PREVIOUS、LAST、PRIOR、FIRST、または NEXT を使用する場合は、 DECLARE CURSOR 文、または SET SCROLLOPTION 文および SET CONURRENCY 文を指定して、適切なカーソルオプションも設定する必要があります。 さらに、ホスト変数のデータ型は、対応するデータベース列のデータ型と互換性がなければなりません。
列の数がホスト変数の数よりも少ない場合は、SQLWARN3 の値が W に設定されます。エラーが発生した場合には、 それ以上の列は処理されません。(処理済みの列は元に戻りません。)
別な方法として、:hvar 変数に、カーソル宣言文の選択リストにある列にそれぞれ対応する複数のフィールドが入った COBOL レコードを指定できます。この形式を使用する場合は、SQL コンパイラ指令の DB2 オプションを指定する必要があります (この形式を使用すると、PREPARE INTO 文と DESCRIBE 文が COBOL コンパイラによって拒否されるので注意してください)。
ANSI92ENTRY を設定して、NULL 値をフェッチした場合に、NULL 標識がなければ SQLCODE が -19425 に設定されます。 ANSI92ENTRY を設定していない場合は、SQLCODE が 0 になります。どちらの場合も、 SQLSTATE は 22002、SQLWARN2 は W になります。
INTO 句のホスト変数の 1 つが配列である場合、INTO 句のホスト変数はすべて配列にする必要があります。
* Declare a cursor for a given SQL statement. EXEC SQL DECLARE C1 CURSOR FOR SELECT last_name, first_name FROM staff END-EXEC EXEC SQL OPEN C1 END-EXEC * Fetch the current values from the cursor into the host variables * and if everything goes ok, display the values of the host * variables PERFORM UNTIL SQLCODE NOT = ZERO EXEC SQL FETCH C1 INTO :lname,:fname END-EXEC IF SQLCODE NOT = ZERO AND SQLCODE NOT = 100 DISPLAY 'Error: Could not perform fetch' DISPLAY SQLERRML DISPLAY SQLERRMC EXEC SQL DISCONNECT ALL END-EXEC STOP RUN END-IF DISPLAY 'First name: 'fname DISPLAY 'Last name : 'lname DISPLAY SPACES END-PERFORM