DELETE文またはUPDATE文でCURRENT OF cursor_name句を使用すると、指定したカーソルから最後にFETCHした行を参照できます。カーソルをオープンし、行に位置付けておく必要があります。FETCHが一度も行われていない場合や、そのカーソルがオープンされていない場合には、CURRENT OF句を使用するとエラーが発生し、1行も処理されません。
UPDATE文またはDELETE文のCURRENT OF句で参照するカーソルをDECLAREするときに、FOR UPDATE OF句を任意で指定できます。CURRENT OF句は、必要に応じてFOR UPDATE句を追加するようにプリコンパイラに指示します。
次の例では、CURRENT OF句を使用して、emp_cursorという名前のカーソルから最後にFETCHされた行を参照します。
EXEC SQL DECLARE emp_cursor CURSOR FOR SELECT ename, sal FROM emp WHERE job = 'CLERK' FOR UPDATE OF sal; ... EXEC SQL OPEN emp_cursor; EXEC SQL WHENEVER NOT FOUND GOTO ... for (;;) { EXEC SQL FETCH emp_cursor INTO :emp_name, :salary; ... EXEC SQL UPDATE emp SET sal = :new_salary WHERE CURRENT OF emp_cursor; }
関連項目:
詳細は、FOR UPDATE OFの使用を参照してください
CURRENT OF句は索引構成表では使用できません。
明示的なFOR UPDATE OF句または暗黙的なFOR UPDATE句では、行の排他ロックが取得されます。行はすべて、FETCHされるときではなく、OPEN時にロックされ、COMMITまたはROLLBACKを行うとロックが解除されます。したがって、COMMIT後はFOR UPDATEカーソルからFETCHできません。これを試みると、Oracleから1002エラー・コードが戻されます。
また、ホスト配列はCURRENT OF句と一緒には使用できません。代替方法については、CURRENT OF句の擬似実行についても参照してください。
さらに、関連するFOR UPDATE OF句で複数の表は参照できません。つまり、CURRENT OF句とは結合できないということです。