2017-10-04 1 views
1

Ich habe eine Funktion, die Tabellen eingefügt und aktualisiert. Der Aufruf aus:Oracle: Rufen Sie eine Funktion von "aus Dual wählen" nichts tun

select AGENTS_REGISTRATION() from dual; 

oder:

declare 
    x NUMBER; 
begin 
    select AGENTS_REGISTRATION() into x from dual; 
end; 
/

nichts tun. Ein anderes Formular führt die notwendigen Änderungen durch:

declare 
    x NUMBER; 
begin 
    x := AGENTS_REGISTRATION(); 
end; 
/

Was ist falsch mit den ersten beiden Ausdruck?

+1

Was meinst du mit 'nichts tun'? Da DML in einer Abfrage nicht zulässig ist, sollten Sie den Fehler ORA-14551 erhalten haben. –

+0

Ich führe Ausdrücke in Oracle SQL Developer aus, bekomme aber kein ORA-14551. Ich sehe, dass Leute * geschrieben haben. Sie können keine Funktion verwenden, die Daten in einer ** Select ** -Anweisung * ändert. Können Sie Ihren Kommentar als Antwort hinzufügen? Wusste das nicht .... – gavenkoa

+1

Es ist nicht erlaubt, DML-Operationen innerhalb einer Funktion durchzuführen. Wenn Sie, wie Sie sagen, "es tut nichts", dann gibt es wahrscheinlich "wenn andere dann null" oder eine andere Art von Ausnahmebehandlungskonstrukt, die "ORA-14551" Fehler unterdrückt. –

Antwort

4

Oracle lässt DML Operationen in einer Abfrage nicht zu. Aufruf Funktion, dass inserts/updates/deletes Daten in einer Abfrage erhöhen werden:

ORA-14551: eine DML-Operation in einer Abfrage nicht durchführen kann

Abfrage wird nicht Fehler auslösen, wenn exception innerhalb der Funktion gefangen wurde - es ist sehr gefährlich zu verwenden WHEN OTHERS Exception Handler (oder ORA-14551 direkt mit pragma exception_init fangen), ohne den Fehler erneut zu erhöhen, wie Sie in diesem Beispiel gesehen haben.

Obwohl ich dies nicht empfehlen, ist es möglich, DML Operationen in einer Abfrage zu verwenden, wenn Funktion als autonomous transaction definiert ist (mit pragma autonomous_transaction) - aber das wird zu mehr Problemen führen.

Die Lösung besteht nicht darin, die Funktion innerhalb einer Abfrage aufzurufen - es ist sicherlich nicht sinnvoll, dies zu tun.

Verwandte Themen