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.