Sie könnten die Direktive pragma autonomous_transaction
verwenden . Dadurch wird die Funktion in einer unabhängigen Transaktion ausgeführt, die DML ausführen kann, ohne den ORA-14551 zu erhöhen.
Beachten Sie, dass die Ergebnisse der DML außerhalb des Geltungsbereichs der übergeordneten Transaktion festgeschrieben werden, da die autonome Transaktion unabhängig ist. In den meisten Fällen wäre dies kein akzeptabler Workaround.
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 hat eine nette Erklärung, warum der Fehler überhaupt ausgelöst wird. Es ist nicht sicher, da es von der Reihenfolge abhängen kann, in der die Zeilen verarbeitet werden. Außerdem garantiert Oracle nicht, dass die Funktion mindestens einmal und höchstens einmal pro Zeile ausgeführt wird.