sql >> Databasteknik >  >> RDS >> PostgreSQL

Är PL/pgSQL och SQL i PostgreSQL båda på samma nivå som SQL/PSM-standard, istället för endast som SQL-standard?

För att rensa terminologin:

SQL är en fråga språk som används för att välja, uppdatera, ta bort eller skapa data i en relationsdatabas. Den har inga procedurelement som loopar (FOR , MED ) eller villkorliga uttalanden (IF , ANNARS ) eller variabler eller markörer.

SKAPA FUNKTION är verkligen en "SQL-sats" men är bara en "wrapper" för att specificera ett kodblock som exekveras av något annat än SQL-frågan "motor". Postgres (till skillnad från andra DBMS) stöder flera "runtime-motorer" som kan exekvera kodblocket som skickades till "CREATE FUNCTION"-satsen - en artefakt av det är att koden faktiskt är en sträng så CREATE FUNCTION ser bara ett snöre, inget annat.

Eftersom SQL inte har några procedurelement kan du inte blanda procedurkod och SQL-kod. Om du vill köra procedurkod måste du tala om för servern att du byter "motor" på något sätt. Detta görs genom (SQL) DO kommando som återigen tar en sträng som den inte vet vad den ska göra med, skickar den till servern och säger "här är en bit kod där användaren hävdade att motorn 'xyz' kan köra" - xyz är antingen PL/pgSQL, Python, Perl eller något helt annat.

Detta är samma sak som ett anonymt PL/SQL-block i Oracle som du börjar med DECLARE - allt efter det exekveras av en annan körtidsmotor på servern. MySQL har ingen sådan funktion. Det enda sättet att köra procedurkod är att skapa en procedur (eller funktion) och sedan köra den. Det är därför det inte finns något sådant som DO i MySQL.

Den enda DBMS-produkten som inte tydligt skiljer mellan procedurkod och "vanlig SQL" är SQL Server:T-SQL är en tillägg till SQL-språket som låter dig blanda "vanlig SQL" och processuell SQL utan att berätta för backend att koden behöver en annan motor att köra (vilket är en källa till stor förvirring för personer som migrerar från SQL Server till Postgres eller Oracle).

SQL/PSM är en standard som definierar procedurelement som kan bäddas in i en databasmotor som använder SQL som frågespråk. Jag känner till ingen DBMS-produkt som faktiskt implementerar SQL/PSM. Postgres PL/pgSQL, Oracles PL/SQL, MySQL:s procedurdialekt påminner något om den, men är långt ifrån kompatibel med SQL/PSM-standarden. Jag tror att det närmaste SQL/PSM-standarden är DB2 och kanske HSQLDB

Det är sant. Men sedan, nej DBMS implementerar SQL-standarden fullt ut - men Postgres implementering är förmodligen en som ligger närmast standarden.



  1. mysqli_connect():(HY000/2002):Kan inte ansluta till lokal MySQL-server via socket

  2. Hur ställer jag in SDE-versionen i SSIS-dataflödeskällan

  3. Python/MySQL - LADDA LOKAL INFIL FÖR DATA

  4. NVL() Funktion i Oracle