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;