Đừ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ẽ:
- 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).
- 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ụ
- tạo tất cả DML có liên quan
- 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).