Vous pouvez utiliser la directive pragma autonomous_transaction
. Cela exécutera la fonction dans une transaction indépendante qui pourra effectuer DML sans augmenter l'ORA-14551.
Sachez que puisque la transaction autonome est indépendante, les résultats du DML seront validés en dehors de la portée de la transaction parente. Dans la plupart des cas, ce ne serait pas une solution acceptable.
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 a une belle explication sur la raison pour laquelle l'erreur est générée en premier lieu. Ce n'est pas sûr car cela peut dépendre de l'ordre dans lequel les lignes sont traitées. De plus, Oracle ne garantit pas que la fonction sera exécutée au moins une fois et au plus une fois par ligne.