Toutes les expressions utilisées dans les instructions PL/pgSQL sont traitées par l'exécuteur SQL classique du serveur. En effet, une requête comme
SELECT expression
est traité par le moteur SQL principal. Bien qu'utilisant la commande
SELECT
, tout nom de variable
PL/pgSQL est remplacé par les paramètres
de la requête
(ceci est expliqué en détail dans la Section 41.11.1).
Cela permet au plan de requête du SELECT
d'être
préparé une seule fois, puis d'être réutilisé pour les évaluations
suivantes avec différentes valeurs des variables. Du coup, ce qui arrive
réellement à la première utilisation d'une expression est simplement
une commande PREPARE
. Par exemple, si nous déclarons
deux variables de type integer, x
et
y
, et que nous écrivons :
IF x < y THEN ...
ce qui se passe en arrière plan est équivalent à :
PREPARE nom_instruction
(integer, integer) AS SELECT $1 < $2;
puis cette instruction préparée est exécutée (via EXECUTE
)
pour chaque exécution de l'instruction IF
, avec les
valeurs actuelles des variables PL/pgSQL fournies
en tant que valeurs des paramètres. Généralement, ces détails
ne sont pas importants pour un utilisateur de
PL/pgSQL, mais ils sont utiles à connaître
pour diagnostiquer un problème.
Vous trouverez plus d'informations dans Section 41.11.2.
Comme une expression
est convertie en une
commande SELECT
, elle peut contenir les mêmes clauses
qu'un SELECT
ordinaire, sauf qu'elle ne peut pas
inclure une clause UNION
, INTERSECT
ou EXCEPT
dans la requête principale. Donc, par
exemple, vous pourriez tester si une table est remplie avec
IF count(*) > 0 FROM my_table THEN ...
parce que l'expression
entre
IF
et THEN
est analysé comme si
c'était SELECT count(*) > 0 FROM my_table
. Le
SELECT
doit produire une seule colonne, et pas plus
d'une.(S'il ne produit aucune ligne, le résultat est considéré comme
NULL.)