Potresti usare la direttiva pragma autonomous_transaction
. Ciò eseguirà la funzione in una transazione indipendente che sarà in grado di eseguire DML senza aumentare l'ORA-14551.
Tieni presente che, poiché la transazione autonoma è indipendente, i risultati del DML verranno confermati al di fuori dell'ambito della transazione principale. Nella maggior parte dei casi non sarebbe una soluzione alternativa accettabile.
SQL> CREATE OR REPLACE FUNCTION supercomplex(datainput IN VARCHAR2)
2 RETURN VARCHAR2 IS
3 PRAGMA AUTONOMOUS_TRANSACTION;
4 BEGIN
5 INSERT INTO dumtab VALUES (datainput);
6 COMMIT;
7 RETURN 'done';
8 END supercomplex;
9 /
Function created
SQL> SELECT supercomplex('somevalue') FROM dual;
SUPERCOMPLEX('SOMEVALUE')
--------------------------------------------------------------------------------
done
SQL> select * from dumtab;
A
--------------------------------------------------------------------------------
somevalue
Tom Kyte ha una bella spiegazione sul perché l'errore viene sollevato in primo luogo. Non è sicuro perché può dipendere dall'ordine in cui le righe vengono elaborate. Inoltre, Oracle non garantisce che la funzione venga eseguita almeno una volta e al massimo una volta per riga.