Per chiarire la terminologia:
SQL è una query lingua utilizzata per selezionare, aggiornare, eliminare o creare dati in un database relazionale. Non ha elementi procedurali
come i loop (FOR
, WHILE
) o istruzioni condizionali (IF
, ELSE
) o variabili o cursori.
CREATE FUNCTION
è in effetti una "istruzione SQL" ma è semplicemente un "wrapper" per specificare un blocco di codice che viene eseguito da qualcosa di diverso dal "motore" della query SQL. Postgres (a differenza di altri DBMS) supporta più "motori di runtime" in grado di eseguire il blocco di codice che è stato passato all'istruzione "CREATE FUNCTION" - un artefatto è che il codice è in realtà una stringa, quindi CREATE FUNCTION
vede solo una stringa, nient'altro.
Poiché SQL non ha elementi procedurali, non è possibile combinare codice procedurale e codice SQL. Se vuoi eseguire codice procedurale devi dire al server che stai cambiando "motori" in qualche modo. Questo viene fatto tramite il (SQL) DO
comando che prende di nuovo una stringa con cui non sa cosa fare, la invia al server e dice "ecco un pezzo di codice in cui l'utente ha affermato che il motore 'xyz' può essere eseguito" - xyz
è PL/pgSQL, Python, Perl o qualcosa di completamente diverso.
È lo stesso di un blocco PL/SQL anonimo in Oracle che inizi con DECLARE
- tutto ciò che segue viene eseguito da un diverso motore di runtime sul server. MySQL non ha tale caratteristica. L'unico modo per eseguire il codice procedurale è creare una procedura (o funzione), quindi eseguirla. Ecco perché non esiste una cosa come DO
in MySQL.
L'unico prodotto DBMS che non distingue chiaramente tra codice procedurale e "SQL semplice" è SQL Server:T-SQL è un'estensione del linguaggio SQL che consente di mescolare "SQL normale" e SQL procedurale senza dire al backend che il codice ha bisogno di un motore diverso per funzionare (che è fonte di grande confusione per le persone che migrano da SQL Server a Postgres o Oracle).
SQL/PSM è uno standard che definisce elementi procedurali che possono essere incorporati in un motore di database che utilizza SQL come linguaggio di query. Non conosco alcun prodotto DBMS che implementa effettivamente SQL/PSM. PL/pgSQL di Postgres, PL/SQL di Oracle, il dialetto procedurale di MySQL sono in qualche modo simili a quello, ma lungi dall'essere conforme allo standard SQL/PSM. Penso che il più vicino allo standard SQL/PSM sia DB2 e forse HSQLDB
Questo è vero. Ma allora, no DBMS implementa completamente lo standard SQL, ma l'implementazione di Postgres è probabilmente quella più vicina allo standard.