Tag et kig på denne 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 to UPDATE-sætninger er ækvivalente, WHERE CURRENT OF ...
er blot en genvej til WHERE ROWID = ...
, kan du bruge en af dem.
Faktisk burde dit spørgsmål være "Hvorfor skal vi bruge FOR UPDATE ...
?" Årsagen er, at ROWID kan ændres ved andre operationer, f.eks. ALTER TABLE ... SHRINK SPACE
, flytte tablespace eller store DML'er. FOR UPDATE
låser rækken, dvs. sikrer, at ROWID ikke ændres, før du har afsluttet din transaktion.
Nej, du kan kun frigøre låsen ved at afslutte transaktionen, dvs. ROLLBACK
eller COMMIT