Du kan använda direktivet pragma autonomous_transaction
. Detta kommer att köra funktionen i en oberoende transaktion som kommer att kunna utföra DML utan att höja ORA-14551.
Var medveten om att eftersom den autonoma transaktionen är oberoende, kommer resultaten av DML att begås utanför omfattningen av modertransaktionen. I de flesta fall skulle det inte vara 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 bra förklaring om varför felet tas upp i första hand. Det är inte säkert eftersom det kan bero på i vilken ordning raderna bearbetas. Dessutom garanterar inte Oracle att funktionen kommer att köras minst en gång och högst en gång per rad.