Sehen Sie sich diesen Block an:
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;
Die beiden UPDATE-Anweisungen sind äquivalent, WHERE CURRENT OF ...
ist nur eine Abkürzung für WHERE ROWID = ...
, Sie können beide verwenden.
Eigentlich sollte Ihre Frage lauten "Warum wir FOR UPDATE ...
brauchen ?" Der Grund ist, dass sich die ROWID durch andere Operationen ändern kann, z.B. ALTER TABLE ... SHRINK SPACE
, beweglicher Tablespace oder große DMLs. FOR UPDATE
sperrt die Zeile, d. h. stellt sicher, dass ROWID sich nicht ändert, bis Sie Ihre Transaktion abgeschlossen haben.
Nein, Sie können die Sperre nur aufheben, indem Sie die Transaktion abschließen, d. h. ROLLBACK
oder COMMIT