Dai un'occhiata a questo blocco:
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;
Le due istruzioni UPDATE sono equivalenti, WHERE CURRENT OF ...
è solo una scorciatoia per WHERE ROWID = ...
, puoi usarne uno qualsiasi.
In realtà la tua domanda dovrebbe essere "Perché abbiamo bisogno di FOR UPDATE ...
?" Il motivo è che il ROWID può cambiare con altre operazioni, ad esempio ALTER TABLE ... SHRINK SPACE
, spostando tablespace o grandi DML. FOR UPDATE
blocca la riga, ovvero assicura che ROWID non cambi fino al termine della transazione.
No, puoi sbloccare il blocco solo completando la transazione, ovvero ROLLBACK
o COMMIT