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

thu thập hàng loạt bằng cách sử dụng để cập nhật

Vấn đề là bạn đang cố gắng tìm nạp qua một cam kết.

Khi bạn mở My_Data_Cur với for update , Oracle phải khóa mọi hàng trong My_Data_1 bảng trước khi nó có thể trả về bất kỳ hàng nào. Khi bạn commit , Oracle phải giải phóng tất cả các khóa đó (các khóa mà Oracle tạo ra không mở rộng các giao dịch). Vì con trỏ không còn có các khóa mà bạn yêu cầu, Oracle phải đóng con trỏ vì nó không còn đáp ứng được for update mệnh đề. Do đó, lần tìm nạp thứ hai phải trả về 0 hàng.

Cách tiếp cận hợp lý nhất hầu như luôn luôn là loại bỏ commit và thực hiện toàn bộ công việc trong một giao dịch duy nhất. Nếu bạn thực sự, thực sự, thực sự cần các giao dịch riêng biệt, bạn sẽ cần mở và đóng con trỏ cho mỗi lần lặp lại của vòng lặp. Rất có thể, bạn muốn làm điều gì đó để hạn chế con trỏ chỉ trả về 100 hàng mỗi khi nó được mở (tức là rownum <= 100 ) để bạn không phải chịu chi phí truy cập vào từng hàng để đặt khóa và sau đó là mọi hàng khác với hàng 100 mà bạn đã xử lý và xóa để mở khóa mọi lúc qua vòng lặp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bắt lỗi - ORA-01858:một ký tự không phải số được tìm thấy ở vị trí số được mong đợi

  2. Nhập tệp CSV trong bảng Oracle bằng quy trình đã lưu trữ

  3. Sử dụng 'cột biểu thức chữ hoa chữ thường' trong mệnh đề where

  4. Chọn các giá trị khác biệt từ ba cột với giá trị lớn nhất là một phần tư, nơi có các giá trị trùng lặp

  5. Oracle:không phải là một tháng hợp lệ