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