Kijk eens naar dit 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;
De twee UPDATE-instructies zijn equivalent, WHERE CURRENT OF ...
is slechts een snelkoppeling voor WHERE ROWID = ...
, je kunt ze allebei gebruiken.
Eigenlijk zou je vraag moeten zijn:"Waarom hebben we FOR UPDATE ...
?" De reden is dat de ROWID kan veranderen door andere bewerkingen, bijv. ALTER TABLE ... SHRINK SPACE
, bewegende tablespace of grote DML's. FOR UPDATE
vergrendelt de rij, d.w.z. zorgt ervoor dat ROWID niet verandert totdat u uw transactie hebt voltooid.
Nee, u kunt de vergrendeling alleen ontgrendelen door de transactie te voltooien, d.w.z. ROLLBACK
of COMMIT