Pour clarifier la terminologie :
SQL est une requête langage utilisé pour sélectionner, mettre à jour, supprimer ou créer des données dans une base de données relationnelle. Il n'a pas d'éléments procéduraux
comme des boucles (FOR
, WHILE
) ou des instructions conditionnelles (IF
, ELSE
) ou des variables ou des curseurs.
CREATE FUNCTION
est en effet une "instruction SQL", mais n'est qu'un "wrapper" pour spécifier un bloc de code qui est exécuté par quelque chose de différent du "moteur" de requête SQL. Postgres (contrairement aux autres SGBD) prend en charge plusieurs "moteurs d'exécution" qui peuvent exécuter le bloc de code qui a été transmis à l'instruction "CREATE FUNCTION" - un artefact de cela est que le code est en fait une chaîne donc CREATE FUNCTION
ne voit qu'une chaîne, rien d'autre.
Parce que SQL n'a pas d'éléments procéduraux, vous ne pouvez pas mélanger le code procédural et le code SQL. Si vous souhaitez exécuter du code procédural, vous devez indiquer au serveur que vous changez de "moteur" d'une manière ou d'une autre. Cela se fait via le (SQL) DO
commande qui prend à nouveau une chaîne dont elle ne sait pas quoi faire, l'envoie au serveur et dit "voici un morceau de code où l'utilisateur a affirmé que le moteur 'xyz' peut s'exécuter" - xyz
est soit PL/pgSQL, Python, Perl ou quelque chose de complètement différent.
C'est la même chose qu'un bloc PL/SQL anonyme dans Oracle que vous commencez par DECLARE
- tout ce qui suit est exécuté par un moteur d'exécution différent sur le serveur. MySQL n'a pas une telle fonctionnalité. La seule façon d'exécuter du code procédural est de créer une procédure (ou fonction), puis de l'exécuter. C'est pourquoi il n'y a rien de tel que DO
dans MySQL.
Le seul produit SGBD qui ne fait pas clairement la distinction entre le code procédural et le "plain SQL" est SQL Server :T-SQL est une extension du langage SQL qui permet de mélanger le "SQL régulier" et le SQL procédural sans dire au backend que le code a besoin d'un moteur différent pour fonctionner (ce qui est une source de grande confusion pour les personnes migrant de SQL Server vers Postgres ou Oracle).
SQL/PSM est une norme qui définit les éléments procéduraux qui peuvent être intégrés dans un moteur de base de données qui utilise SQL comme langage de requête. Je ne connais aucun produit SGBD qui implémente réellement SQL/PSM. Le PL/pgSQL de Postgres, le PL/SQL d'Oracle, le dialecte procédural de MySQL sont quelque peu similaires à cela, mais loin d'être conformes à la norme SQL/PSM. Je pense que le plus proche de la norme SQL/PSM est DB2 et peut-être HSQLDB
C'est vrai. Mais alors, non Le SGBD implémente entièrement le standard SQL - mais l'implémentation de Postgres est probablement l'une des plus proches du standard.