Ta en titt på detta block:
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 två UPDATE-satserna är likvärdiga, WHERE CURRENT OF ...
är bara en genväg till WHERE ROWID = ...
, du kan använda någon av dem.
Egentligen borde din fråga vara "Varför behöver vi FOR UPDATE ...
?" Anledningen är att ROWID kan ändras av andra operationer, t.ex. ALTER TABLE ... SHRINK SPACE
, flytta bordsutrymme eller stora DML:er. FOR UPDATE
låser raden, det vill säga säkerställer att ROWID inte ändras förrän du avslutat din transaktion.
Nej, du kan endast släppa låset genom att slutföra transaktionen, dvs. ROLLBACK
eller COMMIT