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

ORA-14551:Innerhalb einer Abfrage kann keine DML-Operation ausgeführt werden

Die Bedeutung des Fehlers ist ziemlich klar:Wenn wir eine Funktion aus einem SELECT-Statement heraus aufrufen, kann sie keine DML-Statements ausführen, also INSERT, UPDATE oder DELETE, oder es kommen sogar DDL-Statements dazu.

Nun, das Code-Snippet, das Sie gepostet haben, enthält einen Aufruf von PIPE ROW, also rufen Sie dies einfach als SELECT * FROM TABLE() auf. Aber es enthält DELETE- und INSERT-Anweisungen, so dass es die Reinheitsstufen verletzt, die für Funktionen in SELECT-Anweisungen erforderlich sind.

Sie müssen diese DML-Anweisungen also entfernen. Sie verwenden sie, um eine globale temporäre Tabelle zu füllen, aber das ist eine gute Nachricht. Sie haben keinen Code eingefügt, der die GTT tatsächlich verwendet, daher ist es schwierig, sicher zu sein, aber die Verwendung von GTTs ist oft unnötig. Mit mehr Details können wir Problemumgehungen vorschlagen.

Bezieht sich dies auf diese andere Frage von dir ? Wenn ja, sind Sie meinem Rat gefolgt, diese Antwort hatte ich auf eine ähnliche Frage gegeben ?

Der Vollständigkeit halber ist es möglich, DML- und DDL-Anweisungen in eine Funktion aufzunehmen, die in einer SELECT-Anweisung aufgerufen wird. Die Problemumgehung besteht darin, das Pragma AUTONOMOUS_TRANSACTION zu verwenden. Dies ist selten eine gute Idee und würde in diesem Szenario sicherlich nicht helfen. Da die Transaktion autonom ist, sind die von ihr vorgenommenen Änderungen für die aufrufende Transaktion unsichtbar. Das bedeutet in diesem Fall, dass die Funktion das Ergebnis des Löschens oder Einfügens in der GTT nicht sehen kann.