Documentation PostgreSQL 14.22 » Programmation serveur » PL/pgSQL -- Langage de procédures SQL » Expressions

Précédent | Niveau supérieur | Suivant
43.3. Déclarations | Sommaire | 43.5. Instructions de base

## 43.4. Expressions

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 43.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 43.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.)