ディレクティブpragma autonomous_transaction
を使用できます 。これにより、ORA-14551を発生させずにDMLを実行できる独立したトランザクションに関数が実行されます。
自律型トランザクションは独立しているため、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は、関数が行ごとに少なくとも1回、最大で1回実行されることを保証しません。