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