読者です 読者をやめる 読者になる 読者になる

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行ずつロック解除なんて挙動はありえないんだね。

参考

ORA-00910からORA-01497

原因: …カーソルがFOR UPDATE句でオープンされた場合、COMMIT発行後のフェッチでエラーが戻されます。… 処置: …FOR UPDATE句によってオープンされたカーソルのフェッチ・ループ内ではCOMMIT文を発行しないでください。…