Echa un vistazo a este bloque:
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;
Las dos sentencias UPDATE son equivalentes, WHERE CURRENT OF ...
es solo un atajo para WHERE ROWID = ...
, puedes usar cualquiera de ellos.
En realidad, su pregunta debería ser "¿Por qué necesitamos FOR UPDATE ...
?" La razón es que el ROWID puede cambiar por otras operaciones, por ejemplo, ALTER TABLE ... SHRINK SPACE
, tablespace móvil o DML grandes. FOR UPDATE
bloquea la fila, es decir, asegura que ROWID no cambie hasta que finalice su transacción.
No, solo puede liberar el bloqueo al finalizar la transacción, es decir, ROLLBACK
o COMMIT