Jetez un œil à ce bloc :
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;
Les deux instructions UPDATE sont équivalentes, WHERE CURRENT OF ...
est juste un raccourci pour WHERE ROWID = ...
, vous pouvez utiliser l'un ou l'autre.
En fait, votre question devrait être "Pourquoi avons-nous besoin de FOR UPDATE ...
?" La raison en est que le ROWID peut changer par d'autres opérations, par exemple ALTER TABLE ... SHRINK SPACE
, tablespace mobile ou grands DML. FOR UPDATE
verrouille la ligne, c'est-à-dire garantit que ROWID ne change pas tant que vous n'avez pas terminé votre transaction.
Non, vous ne pouvez libérer le verrou qu'en terminant la transaction, c'est-à-dire ROLLBACK
ou COMMIT