オプションのFOR句を使用すれば、次のSQL文で処理される配列要素の数を設定できます。
DELETE
EXECUTE
FETCH
INSERT
OPEN
UPDATE
FOR
句は特にUPDATE
文、INSERT
文およびDELETE
文で役に立ちます。これらの文では、配列全体を使用する必要のない場合があります。FOR
句を使用すると、次の例のように、使用する要素を必要な数に制限できます。
EXEC SQL BEGIN DECLARE SECTION; emp_name (100) CHARACTER(20); salary (100) REAL; rows_to_insert INTEGER; EXEC SQL END DECLARE SECTION; -- populate the host arrays set rows_to_insert = 25; -- set FOR-clause variable EXEC SQL FOR :rows_to_insert -- will process only 25 rows INSERT INTO EMP (ENAME, SAL) VALUES (:emp_name, :salary);
FOR
句では、配列要素数をカウントするために整数型のホスト変数を使用する必要があります。たとえば、次の文は無効です。
EXEC SQL FOR 25 -- illegal INSERT INTO EMP (ENAME, EMPNO, SAL) VALUES (:emp_name, :emp_number, :salary);
FOR
句の変数は、処理する配列要素数を指定します。この数は、最小の配列次元を超えないように設定します。また、この数は正数であることが必要です。負数またはゼロを指定すると、行は処理されません。
SELECT
文でFOR
句を使用すると、次のエラー・メッセージが表示されます。
PCC-E-0056: FOR clause not allowed on SELECT statement at ...
意味が不明確なため、SELECT
文ではFOR
句を使用できません。それは「このSELECT
文をn回実行する」という意味でしょうか?それとも、「このSELECT
文を実行するのは1度だが、n行戻す」という意味でしょうか。問題は、前者の場合、実行のたびに複数の行が戻される可能性があることです。後者の場合、カーソルを宣言し、次のように、FETCH
文でFOR
句を使用した方がよいでしょう。
EXEC SQL FOR :limit FETCH emp_cursor INTO ...
次の例のように、UPDATE
文またはDELETE
文でCURRENT OF
句を使用すると、FETCH
文によって戻される最後の行を参照できます。
EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ENAME, SAL FROM EMP WHERE EMPNO = :emp_number; ... EXEC SQL OPEN emp_cursor; ... EXEC SQL FETCH emp_cursor INTO :emp_name, :salary; ... EXEC SQL UPDATE EMP SET SAL = :new_salary WHERE CURRENT OF emp_cursor;
ただし、FOR句とCURRENT
OF
句は併用できません。次の文は、limitの論理値が1に限定されているため無効です(つまり、現在の行を更新または削除できるのは1回のみです)。
EXEC SQL FOR :limit UPDATE EMP SET SAL = :new_salary WHERE CURRENT OF emp_cursor; ... EXEC SQL FOR :limit DELETE FROM EMP WHERE CURRENT OF emp_cursor;