sql >> Database >  >> RDS >> PostgreSQL

Zijn PL/pgSQL en SQL in PostgreSQL beide op hetzelfde niveau als de SQL/PSM-standaard, in plaats van alleen als SQL-standaard?

Om de terminologie te verduidelijken:

SQL is een query taal die wordt gebruikt om gegevens in een relationele database te selecteren, bij te werken, te verwijderen of aan te maken. Het heeft geen procedurele elementen zoals lussen (FOR , WHILE ) of voorwaardelijke instructies (IF , ELSE ) of variabelen of cursors.

CREATE FUNCTION is inderdaad een "SQL-instructie", maar het is slechts een "wrapper" om een ​​codeblok op te geven dat wordt uitgevoerd door iets anders dan de SQL-query "engine". Postgres ondersteunt (in tegenstelling tot andere DBMS) meerdere "runtime-engines" die het codeblok kunnen uitvoeren dat is doorgegeven aan de instructie "CREATE FUNCTION" - een artefact daarvan is dat de code eigenlijk een string is, dus CREATE FUNCTION code> ziet alleen een string, niets anders.

Omdat SQL geen procedurele elementen heeft, kunt u procedurele code en SQL-code niet combineren. Als u procedurele code wilt uitvoeren, moet u de server vertellen dat u op de een of andere manier van "engine" wisselt. Dit gebeurt via de (SQL) DO commando dat opnieuw een string neemt waarvan het niet weet wat het ermee moet doen, het naar de server stuurt en zegt "hier is een stukje code waar de gebruiker beweerde dat de engine 'xyz' kan uitvoeren" - xyz is ofwel PL/pgSQL, Python, Perl of iets heel anders.

Dit is hetzelfde als een anoniem PL/SQL-blok in Oracle dat u begint met DECLARE - alles daarna wordt uitgevoerd door een andere runtime-engine op de server. MySQL heeft zo'n functie niet. De enige manier om procedurele code uit te voeren, is door een procedure (of functie) te maken en die vervolgens uit te voeren. Daarom bestaat er niet zoiets als DO in MySQL.

Het enige DBMS-product dat geen duidelijk onderscheid maakt tussen procedurele code en "plain SQL" is SQL Server:T-SQL is een uitbreiding op de SQL-taal waarmee u "gewone SQL" en procedurele SQL kunt mixen zonder de backend te vertellen dat de code heeft een andere engine nodig om te draaien (wat een bron van grote verwarring is voor mensen die migreren van SQL Server naar Postgres of Oracle).

SQL/PSM is een standaard die procedurele elementen definieert die kunnen worden ingebed in een database-engine die SQL als querytaal gebruikt. Ik ken geen DBMS-product dat daadwerkelijk SQL/PSM implementeert. De PL/pgSQL van Postgres, de PL/SQL van Oracle en het procedurele dialect van MySQL lijken daar enigszins op, maar voldoen verre van aan de SQL/PSM-standaard. Ik denk dat DB2 het dichtst bij de SQL/PSM-standaard ligt en misschien HSQLDB

Dat is waar. Maar dan, nee DBMS implementeert de SQL-standaard volledig, maar de implementatie van Postgres komt waarschijnlijk het dichtst bij de standaard.



  1. Hoe getallen naar woorden te converteren - ORACLE

  2. Oracle-query sequentiële sommatie per rijen

  3. een mysql-query herhalen

  4. C#:een door de gebruiker gedefinieerd type doorgeven aan een opgeslagen procedure van Oracle