for update句でオープンしたカーソルのforループ内でcommitしたらどうなるのっと
for update付きカーソルのforループ内でcommitしてみた。
for rec in ( select h.employee_id as employee_id, h.job_id as job_id, h.start_date as start_date from jobs j, job_history h where j.job_id = h.job_id and j.job_id = 'ST_CLERK' for update nowait ) loop update job_history set employee_id = rec.employee_id - 1 where job_id = rec.job_id and start_date = rec.start_date; commit; end loop;
行1でエラーが発生しました。: ORA-01002: フェッチ順序が無効です。
ときて、(おそらく)1行目のレコードだけが変更・commitされていた。1行ずつロック解除なんて挙動はありえないんだね。
参考
原因: …カーソルがFOR UPDATE句でオープンされた場合、COMMIT発行後のフェッチでエラーが戻されます。… 処置: …FOR UPDATE句によってオープンされたカーソルのフェッチ・ループ内ではCOMMIT文を発行しないでください。…