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.