このブロックを見てください:
DECLARE
CURSOR c1 IS
SELECT course_number, ROWID AS RID
FROM courses_tbl
FOR UPDATE;
begin
FOR aCourse IN c1 LOOP
UPDATE courses_tbl SET course_number = aCourse.course_number + 1
WHERE CURRENT OF c1;
UPDATE courses_tbl SET course_number = aCourse.course_number + 1
WHERE ROWID = aCourse.RID
end loop;
end;
2つのUPDATEステートメントは同等です。WHERE CURRENT OF ...
WHERE ROWID = ...
の単なるショートカットです 、どちらでも使用できます。
実際の質問は、「なぜFOR UPDATE ...
が必要なのか」ということです。 ?"理由は、ROWIDが他の操作(ALTER TABLE ... SHRINK SPACE
など)によって変更される可能性があるためです。 、テーブルスペースまたは大きなDMLの移動。 FOR UPDATE
行をロックします。つまり、トランザクションが完了するまでROWIDが変更されないようにします。
いいえ、ロックを解除するには、トランザクションを終了する必要があります。つまり、ROLLBACK
またはCOMMIT