Từ tài liệu Oracle :
Nếu truy vấn của bạn tham chiếu đến một bảng thì không có sự khác biệt giữa FOR UPDATE
và FOR UPDATE OF ...
, nhưng cái sau vẫn có thể hữu ích như một tài liệu tự cung cấp cho bạn biết những cột nào bạn định cập nhật. Nó không hạn chế những gì bạn có thể cập nhật. Nếu bạn có:
CURSOR cur IS SELECT * FROM emp FOR UPDATE OF sal;
thì bạn vẫn có thể làm:
UPDATE emp SET comm = comm * 1.1 WHERE CURRENT OF cur;
Nhưng nếu có nhiều hơn một bảng thì FOR UPDATE OF ...
sẽ chỉ khóa các hàng trong bảng có chứa các cột bạn chỉ định trong OF
mệnh đề.
Trái ngược với những gì tôi nghĩ bạn đang nói trong câu hỏi. chỉ định FOR UPDATE OF sal
không chỉ khóa sal
cột; bạn không bao giờ có thể khóa một cột duy nhất, khóa tối thiểu là ở cấp hàng. ( Đọc thêm về khóa
). Nó khóa tất cả các hàng trong bảng có chứa SAL
, được chọn bởi truy vấn.
Trong bản cập nhật cho câu hỏi của bạn, truy vấn con trỏ của bạn đang tham gia emp
và dept
, nhưng OF
mệnh đề chỉ có sal
, một cột trong emp
bàn. Các hàng trong emp
bảng sẽ bị khóa khi con trỏ được mở và những ổ khóa đó sẽ không được giải phóng cho đến khi bạn commit
hoặc rollback
phiên đó. Trong vòng lặp con trỏ của bạn, bạn có thể thực hiện:
UPDATE emp SET ... WHERE CURRENT OF emp_cur;
... để cập nhật hàng trong emp
bảng liên quan đến sự lặp lại này của vòng lặp. Bạn không thể làm:
UPDATE dept SET ... WHERE CURRENT OF emp_cur;
... bởi vì các hàng trong dept
bảng không bị khóa, vì không có cột nào trong OF
. Điều đó cũng có nghĩa là trong phiên thứ hai của bạn, dept
các hàng có thể được cập nhật tự do, vì chúng không bị khóa bởi phiên đầu tiên.