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

Warum können wir gespeicherte Prozeduren nicht in der Select-Anweisung in Oracle ausführen? gibt es einen triftigen grund?

Prozeduren sind in SQL-Anweisungen nicht erlaubt, weil das Mischen deklarativer und imperativer Programmierstile verwirrend ist.

Eine SQL-Anweisung ist eine Liste von Bedingungen – es liegt an Oracle zu entscheiden, wie die Ergebnismenge erzeugt wird, die diesen Bedingungen entspricht. Eine gespeicherte PL/SQL-Prozedur ist eine Reihe von Anweisungen, die Dinge auf sehr vorhersehbare Weise ändern.

Wie oft sollte im folgenden Beispiel pr hingerichtet werden? Wird es vor oder nach id = 1 ausgeführt ? Wenn SQL-Anweisungen eine vordefinierte Reihenfolge hätten, wäre der Optimierer nicht in der Lage, Prädikate zu pushen, Unterabfragen zusammenzuführen usw., und die Leistung wäre inakzeptabel.

select *
from table1
where id = 1
    and pr;

Auch wenn im select eine Prozedur verwendet wurde Liste, es kann keinen Sinn machen. Zum Beispiel select Liste innerhalb eines exists wird immer ignoriert.

select * from dual where exists (select pr from dual);

In Wirklichkeit müssen SQL-Anweisungen jedoch manchmal mit der Außenwelt interagieren, und es ist eine gewisse prozedurale Logik erforderlich. Funktionen sind erlaubt, weil sie normalerweise Berechnen Sie einfach etwas und geben Sie einen Wert zurück. Funktionen sind normalerweise nicht vom Programmzustand abhängig und haben viele Seiteneffekte. Ihre Funktionen könnten Verwenden Sie Sitzungsvariablen, aktualisieren Sie Tabellen (wenn es auf PRAGMA AUTONOMOUS TRANSACTION eingestellt ist ), einen Kontext setzen usw. Oracle kann Sie nicht davon abhalten, solche Dinge zu tun, aber Prozeduren in SQL-Anweisungen zu verbieten, wird solchen Code zumindest entmutigen.