Можете да използвате директивата pragma autonomous_transaction
. Това ще изпълни функцията в независима транзакция, която ще може да изпълнява DML, без да повдига ORA-14551.
Имайте предвид, че тъй като автономната транзакция е независима, резултатите от DML ще бъдат ангажирани извън обхвата на родителската транзакция. В повечето случаи това не би било приемливо решение.
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
Том Кайт има хубаво обяснение защо грешката се повдига на първо място. Не е безопасно, защото може да зависи от реда, в който се обработват редовете. Освен това Oracle не гарантира, че функцията ще бъде изпълнена поне веднъж и най-много веднъж на ред.