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

Oracle After Delete Trigger ... Làm thế nào để tránh Bảng đột biến (ORA-04091)?

Giải pháp tiêu chuẩn cho lỗi bảng thay đổi là tạo

  • Một gói có tập hợp các khóa (tức là docId trong trường hợp này). Một bảng tạm thời cũng sẽ hoạt động
  • Một trình kích hoạt câu lệnh before khởi chạy bộ sưu tập
  • Trình kích hoạt cấp hàng điền vào bộ sưu tập với mỗi docId đã thay đổi
  • Một trình kích hoạt câu lệnh sau lặp lại bộ sưu tập và thực hiện CẬP NHẬT thực tế

Vì vậy, một cái gì đó như

CREATE OR REPLACE PACKAGE pkg_document_status
AS
  TYPE typ_changed_docids IS TABLE OF documentos.docId%type;
  changed_docids typ_changed_docids := new typ_changed_docids ();

  <<other methods>>
END;

CREATE OR REPLACE TRIGGER trg_init_collection
  BEFORE DELETE ON documentStatusHistory
BEGIN
  pkg_document_status.changed_docids.delete();
END;

CREATE OR REPLACE TRIGGER trg_populate_collection
  BEFORE DELETE ON documentStatusHistory
  FOR EACH ROW
BEGIN
  pkg_document_status.changed_docids.extend();
  pkg_document_status.changed_docids( pkg_document_status.changed_docids.count() ) := :old.docId;
END;

CREATE OR REPLACE TRIGGER trg_use_collection
  AFTER DELETE ON documentStatusHistory
BEGIN
  FOR i IN 1 .. pkg_document_status.changed_docids.count()
  LOOP
    <<fix the current status for pkg_document_status.changed_docids(i) >>
  END LOOP;
  pkg_document_status.changed_docids.delete();
END;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tác dụng của việc đặt cam kết sau DML trong thủ tục là gì?

  2. 40 câu hỏi bạn phải biết về R12.2

  3. Oracle PL / SQL:Xuất dữ liệu từ một bảng sang CSV

  4. Làm thế nào để gọi một proc được lưu trữ từ bao phấn và sửa đổi con trỏ được trả về?

  5. Sử dụng ngày trong ràng buộc kiểm tra, Oracle