埋込みSQLでオプションのFOR句を使用すると、次に示すSQL文が処理する配列要素の数を設定できます。
DELETE
EXECUTE
FETCH
INSERT
OPEN
UPDATE
特にUPDATE、INSERTおよびDELETE文内でFOR句を使用すると便利です。これらの文に配列全体を使用する必要がないときもあります。次の例に示すように、FOR句を使用すると、使用する要素数を任意の数に制限できます。
char emp_name[100][20]; float salary[100]; int rows_to_insert; /* populate the host arrays */ 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句では、配列要素をカウントするための整数型のホスト変数や、整数リテラルも使用できます。整数値を取るC言語の複合式は使用できません。たとえば、整数式を使用する次の文は無効です。
EXEC SQL FOR :rows_to_insert + 5 /* illegal */ INSERT INTO emp (ename, empno, sal) VALUES (:emp_name, :emp_number, :salary);
FOR句の変数では、処理する配列の要素数を指定します。この数は、最小の配列次元を超えないように設定します。内部では、値は符号なしの数量として扱われます。付号付きのホスト変数を使用して負の値を渡すと、予期せぬ動作が発生します。
SELECT文中でFOR句を使用すると、エラー・メッセージが戻されます。
FOR句は意味があいまいなため、SELECT文中では使用できません。「この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;
ただし、CURRENT OF句とFOR句は併用できません。次の文は、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;