Sådan klarer du terminologien:
SQL er en forespørgsel sprog, der bruges til at vælge, opdatere, slette eller oprette data i en relationsdatabase. Den har ingen procedureelementer
lignende sløjfer (FOR
, MENS
) eller betingede sætninger (IF
, ANDEN
) eller variabler eller markører.
OPRET FUNKTION
er faktisk en "SQL-sætning", men er blot en "indpakning" til at specificere en kodeblok, der udføres af noget andet end SQL-forespørgslen "engine". Postgres (i modsætning til andre DBMS) understøtter flere "runtime engines", der kan udføre den kodeblok, der blev sendt til "CREATE FUNCTION"-sætningen - en artefakt af det er, at koden faktisk er en streng, så CREATE FUNCTION ser kun en streng, intet andet.
Fordi SQL ikke har nogen procedureelementer, kan du ikke blande procedurekode og SQL-kode. Hvis du vil køre procedurekode, skal du fortælle serveren, at du på en eller anden måde skifter "motorer". Dette gøres gennem (SQL) DO
kommando som igen tager en streng, som den ikke ved hvad den skal gøre med, sender den til serveren og siger "her er et stykke kode, hvor brugeren hævdede, at motoren 'xyz' kan udføre" - xyz er enten PL/pgSQL, Python, Perl eller noget helt andet.
Dette er det samme som en anonym PL/SQL-blok i Oracle, som du starter med DECLARE
- alt efter det udføres af en anden runtime-motor på serveren. MySQL har ingen sådan funktion. Den eneste måde at køre procedurekode på er at oprette en procedure (eller funktion) og derefter køre den. Det er derfor, der ikke er sådan noget som DO
i MySQL.
Det eneste DBMS-produkt, der ikke klart skelner mellem procedurekode og "almindelig SQL" er SQL Server:T-SQL er en udvidelse til SQL-sproget, som giver dig mulighed for at blande "almindelig SQL" og proceduremæssig SQL uden at fortælle backend, at koden har brug for en anden motor til at køre (hvilket er en kilde til stor forvirring for folk, der migrerer fra SQL Server til Postgres eller Oracle).
SQL/PSM er en standard, der definerer proceduremæssige elementer, der kan indlejres i en databasemotor, der bruger SQL som forespørgselssprog. Jeg kender intet DBMS-produkt, der rent faktisk implementerer SQL/PSM. Postgres' PL/pgSQL, Oracle's PL/SQL, MySQL's proceduredialekt ligner noget, men er langt fra i overensstemmelse med SQL/PSM-standarden. Jeg tror, at det tætteste på SQL/PSM-standarden er DB2 og måske HSQLDB
Det er sandt. Men altså, nej DBMS implementerer SQL-standarden fuldt ud - men Postgres' implementering er nok en, der er tættest på standarden.