Skip to main content
 

All' interno di un trigger, sottomettere PL/SQL DOPO il commit

A volte è necessario seguire del codice PL/SQL all'itnerno di un trigger, e questo pezzo di codice necessita di avere visione delle modifiche apportate ai dalla transazione all'interno della quale è stato lanciato il trigger stesso. Per esempio la sottomissione di una coda di lavoro, oppure il lancio di un report. All'interno dei trigger non è possibile, per ovvi motivi, eseguire un commit. Si otterrebbe l'errore oracle:

ORA-04091: table name is mutating, trigger/function may not see it

La soluzione è usare dbms_job.submit.

dbms_job.submit si aspetta un COMMIT per poter funzionare correttamente ma, poichè ci troviamo all'interno di un trigger, possiamo essere certi che un COMMIT è stato già sottoposto altrove.

Esempio

create or replace trigger trigger_name
  after insert on table_name
  for each row
declare
  jobno number;
  txt varchar2(4000);
begin
  ... un po' di PL/SQL, DML e così via ...
  /* Il codice presente nella variabile txt
   * verrà eseguito dopo il commit
   */
  txt := 'declare ...begin .... end;'
  dbms_job.submit(jobno, txt);
end;