Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Lösung, um eine DML-Operation innerhalb einer Abfrage nicht ausführen zu können?

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.