Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Sự khác biệt giữa FOR UPDATE OF và FOR UPDATE

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 UPDATEFOR 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 empdept , 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ODP.NET Oracle.ManagedDataAccess khiến phiên mạng ORA-12537 kết thúc tệp

  2. Làm thế nào để khôi phục khi xảy ra lỗi trong khi thực hiện lệnh trình tải sql?

  3. Chỉ kích hoạt các giá trị đã thay đổi

  4. Gọi thủ tục lưu trữ Oracle từ C #?

  5. SQL - Kết hợp không đầy đủ