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

Hủy thao tác chèn / cập nhật trong trình kích hoạt bằng PL / SQL

Đừng đến đó.

ORA-04091: table XXXX is mutating nói chung là một chỉ báo tốt rằng bất cứ điều gì bạn đang cố gắng làm là quá phức tạp để thực hiện một cách đáng tin cậy với trình kích hoạt.

Chắc chắn, bạn có thể sử dụng biến mảng gói và một số trình kích hoạt ( ugh!) để khắc phục lỗi này, nhưng rất có thể mã của bạn sẽ:

  • không thể xác định được do tính phức tạp của nó và tính chất không thể đoán trước của các trình kích hoạt
  • không đáp ứng tốt với môi trường nhiều người dùng

Đây là lý do tại sao bạn nên suy nghĩ lại cách tiếp cận của mình khi gặp lỗi này. Tôi khuyên bạn nên xây dựng một tập hợp các thủ tục được nhóm độc đáo trong một gói để đối phó với tính nhất quán giữa các hàng. Thu hồi tất cả các đặc quyền để thực hiện DML trực tiếp bảng và chỉ sử dụng các thủ tục đó để sửa đổi nó.

Ví dụ:thủ tục cập nhật của bạn sẽ là nguyên tử xử lý sẽ:

  1. có một khóa để ngăn cập nhật đồng thời trên cùng một nhóm hàng (ví dụ:khóa hồ sơ phòng trong ứng dụng đặt phòng khách sạn).
  2. kiểm tra để đảm bảo rằng hàng được chèn sẽ xác thực tất cả logic nghiệp vụ
  3. tạo tất cả DML có liên quan
  4. khôi phục tất cả các thay đổi của nó (và chỉ những thay đổi của nó - không phải toàn bộ giao dịch) trong trường hợp có lỗi (dễ dàng với PL / SQL, chỉ cần phát sinh lỗi).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trong SQL * Plus, làm cách nào để thay đổi lời nhắc hiển thị người dùng và cơ sở dữ liệu được kết nối?

  2. thư mục oradiag_ <user> là gì?

  3. Truy vấn SQL để tìm nạp OrderID, transactionID, Trạng thái dựa trên trạng thái giao dịch là Char

  4. Giải thích về toán tử INTERSECT của Oracle

  5. verify_queryable_inventory được trả về ORA-20008:Đã hết thời gian chờ