Hãy xem khối này:
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;
Hai câu lệnh UPDATE tương đương nhau, WHERE CURRENT OF ...
chỉ là một phím tắt cho WHERE ROWID = ...
, bạn có thể sử dụng một trong hai.
Thực ra câu hỏi của bạn phải là "Tại sao chúng tôi cần FOR UPDATE ...
? "Lý do là ROWID có thể thay đổi bởi các hoạt động khác, ví dụ:ALTER TABLE ... SHRINK SPACE
, không gian bảng di chuyển hoặc DML lớn. FOR UPDATE
khóa hàng, tức là đảm bảo rằng ROWID không thay đổi cho đến khi bạn hoàn thành giao dịch của mình.
Không, bạn chỉ có thể mở khóa bằng cách hoàn tất giao dịch, tức là ROLLBACK
hoặc COMMIT