Je zou de richtlijn pragma autonomous_transaction
. kunnen gebruiken . Hierdoor wordt de functie in een onafhankelijke transactie uitgevoerd die DML kan uitvoeren zonder de ORA-14551 te verhogen.
Houd er rekening mee dat, aangezien de autonome transactie onafhankelijk is, de resultaten van de DML worden vastgelegd buiten de reikwijdte van de bovenliggende transactie. In de meeste gevallen zou dat geen acceptabele oplossing zijn.
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 heeft een mooie uitleg over waarom de fout in de eerste plaats wordt opgeworpen. Het is niet veilig omdat het kan afhangen van de volgorde waarin de rijen worden verwerkt. Bovendien garandeert Oracle niet dat de functie minimaal één keer en maximaal één keer per rij wordt uitgevoerd.