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