Dê uma olhada neste bloco:
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;
As duas instruções UPDATE são equivalentes,
WHERE CURRENT OF ...
é apenas um atalho para WHERE ROWID = ...
, você pode usar qualquer um deles. Na verdade, sua pergunta deve ser "Por que precisamos de
FOR UPDATE ...
?" O motivo é que o ROWID pode ser alterado por outras operações, por exemplo, ALTER TABLE ... SHRINK SPACE
, movendo o tablespace ou grandes DMLs. FOR UPDATE
bloqueia a linha, ou seja, garante que ROWID não seja alterado até que você termine sua transação. Não, você pode liberar o bloqueio apenas finalizando a transação, ou seja,
ROLLBACK
ou COMMIT