Você pode usar a diretiva
pragma autonomous_transaction
. Isso executará a função em uma transação independente que poderá executar DML sem aumentar o ORA-14551. Esteja ciente de que, como a transação autônoma é independente, os resultados da DML serão confirmados fora do escopo da transação pai. Na maioria dos casos, essa não seria uma solução alternativa aceitável.
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 tem uma boa explicação sobre por que o erro é gerado em primeiro lugar. Não é seguro porque pode depender da ordem em que as linhas são processadas. Além disso, a Oracle não garante que a função será executada pelo menos uma vez e no máximo uma vez por linha.