Разгледайте този блок:
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;
Двата оператора UPDATE са еквивалентни, WHERE CURRENT OF ...
е просто пряк път за WHERE ROWID = ...
, можете да използвате всеки от тях.
Всъщност вашият въпрос трябва да бъде „Защо имаме нужда от FOR UPDATE ...
?" Причината е, че ROWID може да се промени чрез други операции, например ALTER TABLE ... SHRINK SPACE
, движещи се таблични пространства или големи DML. FOR UPDATE
заключва реда, т.е. гарантира, че ROWID няма да се промени, докато не завършите вашата транзакция.
Не, можете да освободите заключването само като завършите транзакцията, т.е. ROLLBACK
или COMMIT