Anda dapat menggunakan direktif pragma autonomous_transaction
. Ini akan menjalankan fungsi menjadi transaksi independen yang dapat melakukan DML tanpa meningkatkan ORA-14551.
Ketahuilah bahwa karena transaksi otonom bersifat independen, hasil DML akan dilakukan di luar cakupan transaksi induk. Dalam kebanyakan kasus, itu bukan solusi yang dapat diterima.
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 memiliki penjelasan yang bagus tentang mengapa kesalahan muncul di tempat pertama. Ini tidak aman karena mungkin tergantung pada urutan pemrosesan baris. Selain itu, Oracle tidak menjamin bahwa fungsi tersebut akan dijalankan setidaknya satu kali dan paling banyak satu kali per baris.