Lorsque vous faites de PL/pgSQL, il est courant de générer une requête de façon dynamique pour l’exécuter par la suite. Pour faire cela, la fonction format() vous permet de définir un modèle qui sera ensuite complété par la valeur d’une ou plusieurs variables.
Voici comment l’utiliser.
Syntaxe de base
La fonction suit la syntaxe suivante : format('modele', 'variable1', 'variable2')
modeleest donc la chaine de texte à formatervariables1etvariable2sont les valeurs à inclure dans le modèle
Le retour est une chaine de texte basée sur le modèle et les valeurs des variables.
Voici un exemple d’utilisation : SELECT format('SELECT %1$I FROM %2$I.%3$I', 'ma_colonne', 'mon_schema', 'Ma_Table')
Qui renvoi le texte : SELECT ma_colonne FROM mon_schema."Ma_Table"
Modèle et emplacement
Le modèle est une chaine de texte contenant des emplacements.
Les emplacements utilisent la syntaxe suivante : %[position][flags][width]type
%: obligatoire, permet d’indiquer le début de l’emplacement. Pour utiliser le caractère « % » sans spécifier d’emplacement, doublez le :%%position: facultatif, permet d’indiquer le paramètre à utiliser (de 1 à n) sous la formen$. À défaut, l’ordre d’apparition de l’emplacement détermine le numéro du paramètre utilisé.flags: facultatif, à utiliser uniquement avecwidth, permet de justifier le texte à droite en indiquant le signe « -« .width: facultatif, indique la longueur de la valeur à retourner via un chiffre entier positif. Il est possible d’utiliser*n$pour indiquer le numéro de l’argument (en remplaçant le « n ») contenant la longueur à utiliser.type: obligatoire, permet d’indiquer si la valeur doit être traitée spécifiquement :sutiliser la valeur telle qu’elle. La valeurNULLest remplacée par une chaine vide.Iutiliser la valeur comme un identifiant SQL : ajoute des guillemets autour de la valeur si un caractère spécial apparait.Lutiliser la valeur comme un littéral SQL : ajoute un apostrophe avant et après la valeur et double les apostrophes contenus.
Exemples
Voici une requête illustrant le fonctionnement de la fonction format().
SELECT
format(modele, arg1, arg2, arg3),
modele,
arg1,
arg2,
arg3
FROM (VALUES
('Valeur 1 : %1$s - valeur 2 : %2$s - valeur 3 : %3$s', 'ma valeur', NULL, NULL),
('Mon texte : %1$s', 'ma valeur', NULL, NULL),
('Mon texte : %1$I', 'ma valeur', NULL, NULL),
('Mon texte : %1$L', 'ma valeur', NULL, NULL),
('SELECT %1$I FROM %2$I.%3$I', 'ma_colonne', 'mon_schema', 'Ma_Table'),
('|%1$20s|', 'mon texte', NULL, NULL),
('|%1$-20s|', 'mon texte', NULL, NULL)
) AS t(modele, arg1, arg2, arg3)
Qui renvoi les données suivantes :
| format | modele | arg1 | arg2 | arg3 |
|---|---|---|---|---|
| Valeur 1 : ma valeur – valeur 2 : – valeur 3 : | Valeur 1 : %1$s – valeur 2 : %2$s – valeur 3 : %3$s | ma valeur | [NULL] | [NULL] |
| Mon texte : ma valeur | Mon texte : %1$s | ma valeur | [NULL] | [NULL] |
| Mon texte : « ma valeur » | Mon texte : %1$I | ma valeur | [NULL] | [NULL] |
| Mon texte : ‘ma valeur’ | Mon texte : %1$L | ma valeur | [NULL] | [NULL] |
| SELECT ma_colonne FROM mon_schema. »Ma_Table » | SELECT %1$I FROM %2$I.%3$I | ma_colonne | mon_schema | Ma_Table |
| | mon texte| | |%1$20s| | mon texte | [NULL] | [NULL] |
| |mon texte | | |%1$-20s| | mon texte | [NULL] | [NULL] |
Cet article vous a plu ?
N'hésitez pas à le partager, il interessera surement certains de vos contacts.
Les thèmes suivants contiennent des articles en lien avec celui-ci, allez faire un tour :
BDDPostgreSQLSQL formatageplpgsqlrequete dynamique