Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle След изтриване на тригер... Как да избегнем мутираща таблица (ORA-04091)?

Стандартното решение за грешка в мутиращата таблица е да се създаде

  • Пакет с колекция от ключове (т.е. docId в този случай). Временна маса също ще работи
  • Задействане на израз преди, което инициализира колекцията
  • Задействане на ниво ред, което попълва колекцията с всеки docId, който е променен.
  • Задействане след изявление, което итерира колекцията и извършва действителното UPDATE

Така че нещо като

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. Добавете първичен ключ за автоматично увеличение към съществуващата таблица в oracle

  2. Вътрешното присъединяване е същото като равнопоставеното?

  3. Как да разрешите ORA-011033:В ход е инициализация или изключване на ORACLE

  4. По-бърз начин за вмъкване чрез скрипт в Oracle?

  5. 12c Адаптивни планове