Podívejte se na tento blok:
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;
Dva příkazy UPDATE jsou ekvivalentní, WHERE CURRENT OF ...
je pouze zkratka pro WHERE ROWID = ...
, můžete použít kterýkoli z nich.
Ve skutečnosti by vaše otázka měla znít „Proč potřebujeme FOR UPDATE ...
?" Důvodem je, že ROWID se může změnit jinými operacemi, např. ALTER TABLE ... SHRINK SPACE
, přesunutí tabulkového prostoru nebo velkých DML. FOR UPDATE
uzamkne řádek, tj. zajistí, že se ROWID nezmění, dokud nedokončíte transakci.
Ne, zámek můžete uvolnit pouze dokončením transakce, tj. ROLLBACK
nebo COMMIT