Documentation PostgreSQL 9.5.25 > Langage SQL > Syntaxe SQL > Fonctions appelantes | |
Expressions de valeurs | Définition des données |
PostgreSQL™ permet aux fonctions qui ont des paramètres nommés d'être appelées en utilisant soit la notation par position soit la notation par nom. La notation par nom est particulièrement utile pour les fonctions qui ont un grand nombre de paramètres car elle rend l'association entre paramètre et argument plus explicite et fiable. Dans la notation par position, un appel de fonction précise les valeurs en argument dans le même ordre que ce qui a été défini à la création de la fonction. Dans la notation nommée, les arguments sont précisés par leur nom et peuvent du coup être intégrés dans n'importe quel ordre. Pour chaque notation, pensez aussi à l'effet des types d'arguments des fonctions documenté dans Section 10.3, « Fonctions ».
Quel que soit la notation, les paramètres qui ont des valeurs par défaut dans leur déclaration n'ont pas besoin d'être précisés dans l'appel. Ceci est particulièrement utile dans la notation nommée car toute combinaison de paramètre peut être omise alors que dans la notation par position, les paramètres peuvent seulement être omis de la droite vers la gauche.
PostgreSQL™ supporte aussi la notation mixée. Elle combine la notation par position avec la notation par nom. Dans ce cas, les paramètres de position sont écrits en premier, les paramètres nommés apparaissent après.
Les exemples suivants illustrent l'utilisation des trois notations, en utilisant la définition de fonction suivante :
CREATE FUNCTION assemble_min_ou_maj(a text, b text, majuscule boolean DEFAULT false) RETURNS text AS $$ SELECT CASE WHEN $3 THEN UPPER($1 || ' ' || $2) ELSE LOWER($1 || ' ' || $2) END; $$ LANGUAGE SQL IMMUTABLE STRICT;
La fonction assemble_min_ou_maj a deux paramètres obligatoires, a et b. Il existe en plus un paramètre optionnel, majuscule, qui vaut par défaut false. Les arguments a et b seront concaténés et forcés soit en majuscule soit en minuscule suivant la valeur du paramètre majuscule. Les détails restant ne sont pas importants ici (voir le Chapitre 35, Étendre SQL pour plus d'informations).
La notation par position est le mécanisme traditionnel pour passer des arguments aux fonctions avec PostgreSQL™. En voici un exemple :
SELECT assemble_min_ou_maj('Hello', 'World', true); assemble_min_ou_maj --------------------- HELLO WORLD (1 row)
Tous les arguments sont indiqués dans l'ordre. Le résultat est en majuscule car l'argument majuscule est indiqué à true. Voici un autre exemple :
SELECT assemble_min_ou_maj('Hello', 'World'); assemble_min_ou_maj ----------------------- hello world (1 row)
Ici, le paramètre majuscule est omis, donc il récupère la valeur par défaut, soit false, ce qui a pour résultat une sortie en minuscule. Dans la notation par position, les arguments peuvent être omis de la droite à la gauche à partir du moment où ils ont des valeurs par défaut.
Dans la notation par nom, chaque nom d'argument est précisé en utilisant => pour le séparer de l'expression de la valeur de l'argument. Par exemple :
SELECT assemble_min_ou_maj(a => 'Hello', b => 'World'); assemble_min_ou_maj --------------------- hello world (1 row)
Encore une fois, l'argument majuscule a été omis, donc il dispose de sa valeur par défaut, false, implicitement. Un avantage à utiliser la notation par nom est que les arguments peuvent être saisis dans n'importe quel ordre. Par exemple :
SELECT assemble_min_ou_maj(a => 'Hello', b => 'World', uppercase => true); assemble_min_ou_maj --------------------- HELLO WORLD (1 row) SELECT assemble_min_ou_maj(a => 'Hello', uppercase => true, b => 'World'); assemble_min_ou_maj --------------------- HELLO WORLD (1 row)
Une syntaxe plus ancienne basée sur « := » est supportée pour des raisons de compatibilité ascendante :
SELECT assemble_min_ou_maj(a := 'Hello', uppercase := true, b := 'World'); assemble_min_ou_maj --------------------- HELLO WORLD (1 row)
La notation mixée combine les notations par position et par nom. Néanmoins, comme cela a déjà été expliqué, les arguments par nom ne peuvent pas précéder les arguments par position. Par exemple :
SELECT assemble_min_ou_maj('Hello', 'World', majuscule => true); assemble_min_ou_maj ----------------------- HELLO WORLD (1 row)
Dans la requête ci-dessus, les arguments a et b sont précisés par leur position alors que majuscule est indiqué par son nom. Dans cet exemple, cela n'apporte pas grand-chose, sauf pour une documentation de la fonction. Avec une fonction plus complexe, comprenant de nombreux paramètres avec des valeurs par défaut, les notations par nom et mixées améliorent l'écriture des appels de fonction et permettent de réduire les risques d'erreurs.
Les notations par appel nommé ou mixe ne peuvent pas être utilisé lors de l'appel d'une fonction d'agrégat (mais elles fonctionnent quand une fonction d'agrégat est utilisée en tant que fonction de fenêtrage).