PL/pgSQL est un langage de procédures chargeable pour le système de bases de données PostgreSQL. Les objectifs de la conception de PL/pgSQL ont été de créer un langage de procédures chargeable qui
est utilisé pour créer des fonctions standards et triggers,
ajoute des structures de contrôle au langage SQL,
permet d'effectuer des traitements complexes,
hérite de tous les types, fonctions et opérateurs définis par les utilisateurs,
est défini comme digne de confiance par le serveur,
est facile à utiliser.
Les fonctions PL/pgSQL acceptent un nombre
variable d'arguments en utilisant le marqueur VARIADIC
.
Cela fonctionne exactement de la même façon pour les fonctions SQL, comme
indiqué dans Section 37.4.5.
Les fonctions écrites en PL/pgSQL peuvent être utilisées partout où une fonction intégrée peut l'être. Par exemple, il est possible de créer des fonctions complexes de traitement conditionnel et, par la suite, de les utiliser pour définir des opérateurs ou de les utiliser dans des expressions d'index.
À partir de la version 9.0 de PostgreSQL, PL/pgSQL est installé par défaut. Il reste toutefois un module chargeable et les administrateurs craignant pour la sécurité de leur instance pourront le retirer.
SQL est le langage que PostgreSQL et la plupart des autres bases de données relationnelles utilisent comme langage de requête. Il est portable et facile à apprendre, mais chaque expression SQL doit être exécutée individuellement par le serveur de bases de données.
Cela signifie que votre application client doit envoyer chaque requête au serveur de bases de données, attendre que celui-ci la traite, recevoir et traiter les résultats, faire quelques calculs, et enfin envoyer d'autres requêtes au serveur. Tout ceci induit des communications interprocessus et induit aussi une surcharge du réseau si votre client est sur une machine différente du serveur de bases de données.
Grâce à PL/pgSQL vous pouvez grouper un bloc de traitement et une série de requêtes au sein du serveur de bases de données, et bénéficier ainsi de la puissance d'un langage de procédures, mais avec de gros gains en terme de communication client/serveur.
Les allers/retours entre le client et le serveur sont éliminés
Il n'est pas nécessaire de traiter ou transférer entre le client et le serveur les résultats intermédiaires dont le client n'a pas besoin
Les va-et-vient des analyses de requêtes peuvent être évités
Ceci a pour conséquence une augmentation considérable des performances en comparaison à une application qui n'utilise pas les procédures stockées.
Ainsi, avec PL/pgSQL vous pouvez utiliser tous les types de données, opérateurs et fonctions du SQL.
Les fonctions écrites en PL/pgSQL peuvent accepter
en argument n'importe quel type de données supporté par le serveur, et
peuvent renvoyer un résultat de n'importe lequel de ces types. Elles peuvent
aussi accepter ou renvoyer n'importe quel type composite (type ligne) spécifié
par nom. Il est aussi possible de déclarer une fonction
PL/pgSQL renvoyant un type record
,
signifiant que le résultat est un type ligne dont les colonnes sont déterminées
par spécification dans la requête appelante (voir la
Section 7.2.1.4).
Les fonctions PL/pgSQL acceptent en entrée et
en sortie les types polymorphes anyelement
,
anyarray
, anynonarray
, anyenum
et anyrange
.
Le type de données réel géré par une fonction polymorphe peut varier
d'appel en appel (voir la Section 37.2.5).
Voir l'exemple de la Section 42.3.1.
Les fonctions PL/pgSQL peuvent aussi renvoyer
un ensemble de lignes (ou une table) de n'importe lequel des type de
données dont les fonctions peuvent renvoyer une instance unique. Ces
fonctions génèrent leur sortie en exécutant RETURN NEXT
pour chaque élément désiré de l'ensemble résultat ou en utilisant
RETURN QUERY
pour afficher le résultat de l'évaluation
d'une requête.
Enfin, une fonction PL/pgSQL peut être déclarée comme renvoyant
void
si elle n'a pas de valeur de retour utile.
Les fonctions PL/pgSQL peuvent aussi être déclarées
avec des paramètres en sortie à la place de la spécification explicite
du code de retour. Ceci n'ajoute pas de fonctionnalité fondamentale au
langage mais c'est un moyen agréable principalement pour renvoyer
plusieurs valeurs.
La notation RETURNS TABLE
peut aussi être utilisé à la
place de RETURNS SETOF
.
Des exemples spécifiques apparaissent dans la Section 42.3.1 et la Section 42.6.1.