Możesz użyć dyrektywy pragma autonomous_transaction
. Spowoduje to uruchomienie funkcji w niezależnej transakcji, która będzie w stanie wykonać DML bez podnoszenia ORA-14551.
Należy pamiętać, że ponieważ transakcja autonomiczna jest niezależna, wyniki DML zostaną zatwierdzone poza zakresem transakcji nadrzędnej. W większości przypadków nie byłoby to akceptowalne obejście.
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 ma ładne wyjaśnienie, dlaczego w pierwszej kolejności pojawia się błąd. Nie jest to bezpieczne, ponieważ może zależeć od kolejności przetwarzania wierszy. Ponadto Oracle nie gwarantuje, że funkcja zostanie wykonana co najmniej raz i najwyżej raz na wiersz.