Spójrz na ten blok:
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;
Dwie instrukcje UPDATE są równoważne, WHERE CURRENT OF ...
to tylko skrót do WHERE ROWID = ...
, możesz użyć każdego z nich.
Właściwie twoje pytanie powinno brzmieć „Dlaczego potrzebujemy FOR UPDATE ...
?” Powodem jest to, że ROWID może się zmienić przez inne operacje, np. ALTER TABLE ... SHRINK SPACE
, przesuwanie przestrzeni tabel lub duże DML. FOR UPDATE
blokuje wiersz, tj. zapewnia, że ROWID nie zmieni się do momentu zakończenia transakcji.
Nie, możesz zwolnić blokadę tylko kończąc transakcję, czyli ROLLBACK
lub COMMIT