PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Sind PL/pgSQL und SQL in PostgreSQL beide auf der gleichen Ebene wie der SQL/PSM-Standard und nicht nur als SQL-Standard?

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.