PostgreSQL™ permet l'écriture de fonctions et de procédures dans des langages différents du SQL et du C. Ces autres langages sont appelés génériquement des langages de procédures (LP, PL en anglais). Le serveur ne possède pas d'interpréteur interne des fonctions écrites dans un langage de procédures. La tâche est donc dévolue à un gestionnaire particulier qui, lui, connait les détails du langage. Le gestionnaire peut prendre en charge le travail de découpage, d'analyse syntaxique, d'exécution, etc., ou simplement servir de « colle » entre PostgreSQL™ et une implémentation existante d'un langage de programmation. Le gestionnaire est lui-même une fonction en langage C compilée dans une bibliothèque partagée et chargée à la demande, comme toute autre fonction C.
Il existe à ce jour quatre langages de procédures dans la distribution standard de PostgreSQL™ : PL/pgSQL (Chapitre 37, PL/pgSQL - Langage de procédures SQL ), PL/Tcl (Chapitre 38, PL/Tcl - Langage de procédures Tcl), PL/Perl (Chapitre 39, PL/Perl - Langage de procédures Perl) et PL/Python (Chapitre 40, PL/Python - Langage de procédures Python).
Il existe d'autres langages de procédures qui ne sont pas inclus dans la distribution principale. L'Annexe H, Projets externes propose des pistes pour les trouver. De plus, d'autres langages peuvent être définis par les utilisateurs. Les bases de développement d'un nouveau langage de procédures sont couvertes dans le Chapitre 47, Écrire un gestionnaire de langage procédural.
Un langage de procédures doit être « installé » dans toute base de données amenée à l'utiliser. Les langages de procédures installés dans la base de données template1 sont automatiquement disponibles dans toutes les bases de données créées par la suite. CREATE DATABASE recopie en effet toutes les informations disponibles dans la base template1. Il est ainsi possible pour l'administrateur de définir, par base, les langages disponibles et d'en rendre certains disponibles par défaut.
Pour les langages fournis avec la distribution standard, l'installation dans la base courante se fait simplement par l'exécution de la commande CREATE LANGUAGE langage . On peut également utiliser le programme createlang(1) pour installer le langage en ligne de commande. Par exemple, pour installer le langage PL/pgSQL dans la base de données template1, on écrit
createlang plpgsql template1
La procédure manuelle décrite ci-dessous n'est recommandée que pour installer des langages personnalisés que CREATE LANGUAGE ne connaît pas.
Procédure 36.1. Installation manuelle de langages de procédures
Un langage de procédures s'installe en quatre étapes effectuées obligatoirement par le superutilisateur des bases de données. Pour les langages connus par CREATE LANGUAGE , les deuxième et troisième étapes peuvent être omises, parce qu'automatiquement réalisées.
La bibliothèque partagée du gestionnaire de langage doit être compilée et installée dans le répertoire de bibliothèques approprié. Cela se déroule comme la construction et l'installation de modules de classiques fonctions C utilisateur ; voir la Section 33.9.6, « Compiler et lier des fonctions chargées dynamiquement ». Il arrive souvent que le gestionnaire du langage dépende d'une bibliothèque externe fournissant le moteur de langage ; dans ce cas, elle doit aussi être installée.
Le gestionnaire doit être déclaré par la commande
CREATE FUNCTION nom_fonction_gestionnaire() RETURNS gestionnaire_langage AS 'chemin-vers-objet-partagé' LANGUAGE C;
Le type de retour spécial gestionnaire_langage indique au système que cette fonction ne renvoie pas un type de données SQL et n'est, de ce fait, pas utilisable directement dans des expressions SQL.
En option, le gestionnaire de langages peut fournir une fonction de « validation » qui vérifie la définition d'une fonction sans réellement l'exécuter. La fonction de validation, si elle existe, est appelée par CREATE FUNCTION . Si une telle fonction est fournie par le gestionnaire, elle sera déclarée avec une commande de la forme
CREATE FUNCTION nom_fonction_validation(oid) RETURNS void AS 'chemin-vers-objet-partagé' LANGUAGE C;
Le LP doit être déclaré par la commande
CREATE [TRUSTED] [PROCEDURAL] LANGUAGE nom_langage HANDLER nom_fonction_gestionnaire [VALIDATOR nom_fonction_valideur] ;
Le mot clé optionnel TRUSTED (N.d.T. : digne de confiance) indique la possibilité pour les utilisateurs ordinaires (sans droit super-utilisateur) d'utiliser ce langage pour créer des procédures et des déclencheurs. Les fonctions en langage de procédures étant exécutées au sein du serveur, le paramètre TRUSTED ne devrait être positionné que pour les langages n'accédant pas aux organes internes du serveur ou au système de fichiers. Les langages PL/pgSQL, PL/Tcl, et PL/Perl sont considérés comme dignes de confiance ; les langages PL/TclU, PL/PerlU, et PL/PythonU sont conçus pour fournir des fonctionnalités illimitées et ne devraient pas être marqués dignes de confiance.
L'Exemple 36.1, « Installation manuelle de PL/pgSQL » présente le fonctionnement de la procédure d'installation manuelle du langage PL/pgSQL.
Exemple 36.1. Installation manuelle de PL/pgSQL
La commande suivante indique au serveur l'emplacement de la bibliothèque partagée pour la fonction de gestion des appels du langage PL/pgSQL.
CREATE FUNCTION plpgsql_call_handler() RETURNS language_handler AS '$libdir/plpgsql' LANGUAGE C;
PL/pgSQL possède une fonction de validation, qui est également déclarée :
CREATE FUNCTION plpgsql_validator(oid) RETURNS void AS '$libdir/plpgsql' LANGUAGE C;
La commande
CREATE TRUSTED PROCEDURAL LANGUAGE plpgsql HANDLER plpgsql_call_handler VALIDATOR plpgsql_validator;
indique l'évocation des fonctions précédentes pour les fonctions et procédures de déclencheur lorsque l'attribut de langage est plpgsql.
Lors de l'installation par défaut de PostgreSQL™, le gestionnaire du langage PL/pgSQL est compilé et installé dans le répertoire des bibliothèques (« lib »). Si le support de Tcl est configuré, les gestionnaires du PL/Tcl et du PL/TclU sont compilés et installés au même endroit. De même, les gestionnaires du PL/Perl et du PL/PerlU sont compilés et installés si le support de Perl est configuré, et PL/PythonU est installé si le support de Python est configuré.