Chapitre 34. Langages de procédures

PostgreSQL permet aux utilisateurs d'écrire des fonctions et des procédures avec des langages autres que le SQL et le C. Ces autres langages sont appelés génériquement des langages de procédures (LP). Pour une fonction écrite dans un langage de procédures, le serveur de bases de données n'a aucune connaissance en interne de la façon d'interpréter le texte du source de la fonction. À la place, la tâche est passée à un gestionnaire spécial qui connaît les détails du langage. Le gestionnaire peut soit faire tout le travail de découpage, d'analyse syntaxique, d'exécution, etc. par lui-même, soit servir de << colle >> entre PostgreSQL et une implémentation existante d'un langage de programmation. Le gestionnaire lui-même est une fonction en langage C compilée dans une bibliothèque partagée et chargée à la demande, tout comme toute autre fonction C.

Actuellement, il existe quatre langages de procédures disponibles dans la distribution standard de PostgreSQL : PL/pgSQL (Chapitre 35), PL/Tcl (Chapitre 36), PL/Perl (Chapitre 37) et PL/Python (Chapitre 38). 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 45.

Certains langages de procédures supplémentaires ne sont pas inclus dans la distribution principale. Annexe H a quelques informations pour les trouver.

34.1. Installation de langages de procédures

Un langage de procédures doit être << installé >> dans chaque base de données où il est destiné à être utilisé. Mais 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 car leurs entrées dans template1 seront copiées par CREATE DATABASE. Ainsi, l'administrateur de bases de données peut décider quels langages sont disponibles dans quelles bases de données et peut rendre certains langages disponibles par défaut s'il le choisit.

Pour les langages fournis avec la distribution standard, le programme createlang peut être utilisé pour installer le langage au lieu de reporter tous les détails à la main. Par exemple, pour installer le langage PL/pgSQL dans la base de données template1, utilisez

createlang plpgsql template1

La procédure manuelle décrite ci-dessous n'est recommandée que pour installer des langages personnalisés que createlang ne connaît pas.

Installation manuelle de langages de procédures

Un langage de procédures s'installe dans une base de données en quatre étapes, qui doivent être effectuées par le superutilisateur de bases de données. Le programme createlang automatise tout sauf l'étape 1.

  1. La bibliothèque partagée pour le gestionnaire de langage doit être compilée et installée dans le répertoire de bibliothèques approprié. Ceci fonctionne comme la construction et l'installation de modules à l'aide de fonctions C classiques définies par un utilisateur ; voir la Section 31.9.6. Souvent, le gestionnaire du langage dépendra d'une bibliothèque externe fournissant le moteur de langage actuel ; dans ce cas, il doit aussi être installé.

  2. Le gestionnaire doit être déclaré par la commande

    CREATE FUNCTION nom_fonction()
        RETURNS langage
        AS 'chemin-vers-objet-partagé'
        LANGUAGE C;

    Le type de retour spécial de langage indique au système de bases de données que cette fonction ne renvoie pas l'un des types de données SQL et n'est pas utilisable directement dans des expressions SQL.

  3. En option, le gestionnaire de langages pourrait fournir une fonction de << validation >> qui vérifie la définition d'une fonction sans réellement l'exécuter. La fonction de validation est appelée par CREATE FUNCTION si elle existe. Si une fonction de validation est fournie par le gestionnaire, déclarez-la avec une commande comme

    CREATE FUNCTION nom_fonction_validation(oid)
        RETURNS void
        AS 'chemin-vers-objet-partagé'
        LANGUAGE C;

  4. 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 indique que les utilisateurs ordinaires n'ayant pas de droits de super-utilisateur devraient être autorisés à utiliser ce langage pour créer des procédures fonctions et déclencheurs. Les fonctions LP étant exécutées au sein du serveur de bases de données, le paramètre TRUSTED ne devrait être positionné que pour les langages n'accédant pas aux organes internes du serveur de bases ou du système de fichiers. Les langages PL/pgSQL, PL/Tcl, et PL/Perl sont considérés comme dignes de confiances ; les langages PL/TclU, PL/PerlU, et PL/PythonU sont conçus pour ne fournir que des fonctionnalités limitées et ne devraient pas être considérées dignes de confiance.

L'Exemple 34-1 montre comment fonctionne la procédure d'installation manuelle avec le langage PL/pgSQL.

Exemple 34-1. Installation manuelle de PL/pgSQL

La commande suivante indique au serveur de bases de données 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 a une fonction de validation, donc nous la déclarons aussi :

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;

définit alors que la fonction déclarée précédemment devrait être invoquée pour les procédures fonctions ou déclencheurs pour lesquelles l'attribut langage est plpgsql.

Lors de l'installation par défaut de PostgreSQL, le gestionnaire pour le langage PL/pgSQL est compilé et installé dans le répertoire des bibliothèques (<< lib >>). Si le support de Tcl y est configuré, les gestionnaires pour PL/Tcl et PL/TclU sont aussi compilés et installés au même endroit. De même, les gestionnaires de PL/Perl et 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é.