Du kunne bruge direktivet pragma autonomous_transaction
. Dette vil køre funktionen ind i en uafhængig transaktion, der vil være i stand til at udføre DML uden at hæve ORA-14551.
Vær opmærksom på, at da den autonome transaktion er uafhængig, vil resultaterne af DML blive forpligtet uden for rammerne af modertransaktionen. I de fleste tilfælde ville det ikke være en acceptabel løsning.
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 har en fin forklaring på, hvorfor fejlen er rejst i første omgang. Det er ikke sikkert, fordi det kan afhænge af rækkefølgen, som rækkerne behandles i. Desuden garanterer Oracle ikke, at funktionen udføres mindst én gang og højst én gang pr. række.