Můžete použít direktivu pragma autonomous_transaction
. Tím se funkce spustí do nezávislé transakce, která bude schopna provádět DML bez zvýšení ORA-14551.
Uvědomte si, že vzhledem k tomu, že autonomní transakce je nezávislá, výsledky DML budou potvrzeny mimo rozsah nadřazené transakce. Ve většině případů by to nebylo přijatelné řešení.
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 má pěkné vysvětlení toho, proč se chyba objevila na prvním místě. Není to bezpečné, protože může záviset na pořadí, ve kterém jsou řádky zpracovávány. Oracle dále nezaručuje, že funkce bude provedena alespoň jednou a maximálně jednou na řádek.