Podrías usar la directiva pragma autonomous_transaction
. Esto ejecutará la función en una transacción independiente que podrá realizar DML sin generar el ORA-14551.
Tenga en cuenta que dado que la transacción autónoma es independiente, los resultados del DML se confirmarán fuera del alcance de la transacción principal. En la mayoría de los casos, esa no sería una solución aceptable.
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 tiene una buena explicación sobre por qué se genera el error en primer lugar. No es seguro porque puede depender del orden en que se procesan las filas. Además, Oracle no garantiza que la función se ejecutará al menos una vez y como máximo una vez por fila.