Zur Klärung der Terminologie:
SQL ist eine Abfrage Sprache, die zum Auswählen, Aktualisieren, Löschen oder Erstellen von Daten in einer relationalen Datenbank verwendet wird. Es hat keine prozedurale Elemente
wie Schleifen (FOR
, WHILE
) oder bedingte Anweisungen (IF
, ELSE
) oder Variablen oder Cursor.
CREATE FUNCTION
ist in der Tat eine "SQL-Anweisung", ist aber lediglich ein "Wrapper", um einen Codeblock anzugeben, der von etwas anderem als der SQL-Abfrage-"Engine" ausgeführt wird. Postgres unterstützt (im Gegensatz zu anderen DBMS) mehrere "Laufzeit-Engines", die den Codeblock ausführen können, der an die "CREATE FUNCTION"-Anweisung übergeben wurde - ein Artefakt davon ist, dass der Code tatsächlich eine Zeichenfolge ist, also CREATE FUNCTION
sieht nur einen String, sonst nichts.
Da SQL keine prozeduralen Elemente hat, können Sie prozeduralen Code und SQL-Code nicht mischen. Wenn Sie prozeduralen Code ausführen möchten, müssen Sie dem Server mitteilen, dass Sie irgendwie "Engines" wechseln. Dies geschieht durch das (SQL) DO
Befehl, der wiederum einen String nimmt, mit dem er nichts anfangen soll, ihn an den Server sendet und sagt:"Hier ist ein Stück Code, in dem der Benutzer behauptet, dass die Engine 'xyz' ausführen kann" - xyz
ist entweder PL/pgSQL, Python, Perl oder etwas ganz anderes.
Dies ist dasselbe wie ein anonymer PL/SQL-Block in Oracle, den Sie mit DECLARE
starten - alles danach wird von einer anderen Laufzeit-Engine auf dem Server ausgeführt. MySQL hat keine solche Funktion. Die einzige Möglichkeit, prozeduralen Code auszuführen, besteht darin, eine Prozedur (oder Funktion) zu erstellen und diese dann auszuführen. Deshalb gibt es so etwas wie DO
nicht in MySQL.
Das einzige DBMS-Produkt, das nicht klar zwischen prozeduralem Code und "Plain SQL" unterscheidet, ist SQL Server:T-SQL ist eine Erweiterung der SQL-Sprache, mit der Sie "reguläres SQL" und prozedurales SQL mischen können, ohne dem Backend mitzuteilen, dass der Code benötigt zum Ausführen eine andere Engine (was bei Personen, die von SQL Server zu Postgres oder Oracle migrieren, zu großer Verwirrung führt).
SQL/PSM ist ein Standard, der prozedurale Elemente definiert, die in eine Datenbank-Engine eingebettet werden können, die SQL als Abfragesprache verwendet. Ich kenne kein DBMS-Produkt, das SQL/PSM tatsächlich implementiert. PL/pgSQL von Postgres, PL/SQL von Oracle und der prozedurale Dialekt von MySQL sind dem etwas ähnlich, aber weit davon entfernt, mit dem SQL/PSM-Standard konform zu sein. Ich denke, am nächsten am SQL/PSM-Standard ist DB2 und vielleicht HSQLDB
Das ist wahr. Aber dann, nein DBMS implementiert den SQL-Standard vollständig – aber die Implementierung von Postgres kommt dem Standard wahrscheinlich am nächsten.