Documentation PostgreSQL 9.2.24 > Référence > Commandes SQL > CREATE LANGUAGE | |
CREATE INDEX | CREATE OPERATOR |
CREATE LANGUAGE — Définir un nouveau langage procédural
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGE nom CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGE nom HANDLER gestionnaire_appel [ VALIDATOR fonction_validation ]
CREATE LANGUAGE enregistre un nouveau langage procédural à une base de données PostgreSQL™. En conséquence, les fonctions et les procédures de déclencheurs peuvent être définies dans ce nouveau langage.
À partir de PostgreSQL™ 9.1, la plupart des langages procéduraux ont été tranformés en « extensions », et doivent du coup être installés avec CREATE EXTENSION(7), et non pas avec CREATE LANGUAGE. L'utilisation directe de CREATE LANGUAGE devrait maintenant être réservée aux scripts d'installation d'extension. Si vous avez un langage « nu » dans votre base de données, peut-être comme résultat d'une mise à jour, vous pouvez le convertir en extension en utilisant CREATE EXTENSION nom_langage FROM unpackaged.
CREATE LANGUAGE associe en fait le nom du langage à un ou des fonctions de gestion qui sont responsable de l'exécution des fonctions écrites dans le langage. Chapitre 38, Langages de procédures offre de plus amples informations sur les gestionnaires de fonctions.
La commande CREATE LANGUAGE existe sous deux formes. Dans la première, l'utilisateur ne fournit que le nom du langage désiré et le serveur PostgreSQL™ consulte le catalogue système pg_pltemplate pour déterminer les paramètres adéquats. Dans la seconde, l'utilisateur fournit les paramètres du langage avec son nom. Cette forme peut être utilisée pour créer un langage non défini dans pg_pltemplate. Cette approche est cependant obsolète.
Si le serveur trouve une entrée dans le catalogue pg_pltemplate pour le nom donné, il utilise les données du catalogue quand bien même la commande incluerait les paramètres du langage. Ce comportement simplifie le chargement des anciens fichiers de sauvegarde ; ceux-ci présentent le risque de contenir des informations caduques sur les fonctions de support du langage.
Habituellement, l'utilisateur doit être un superutilisateur PostgreSQL™ pour enregistrer un nouveau langage. Néanmoins, le propriétaire d'une base de données peut enregistrer un nouveau langage dans sa base si le langage est listé dans le catalogue pg_pltemplate et est marqué comme autorisé à être créé par les propriétaires de base (tmpldbacreate à true). La valeur par défaut est que les langages de confiance peuvent être créés par les propriétaires de base de données, mais cela peut être modifié par les superutilisateurs en ajustant le contenu de pg_pltemplate. Le créateur d'un langage devient son propriétaire et peut ensuite le supprimer, le renommer ou le donner à un autre propriétaire.
CREATE OR REPLACE LANGUAGE créera un nouveau langage ou remplacera une définition existante. Si le langage existe déjà, ces paramètres sont mis à jour suivant les valeurs indiquées ou prises de pg_pltemplate mais le propriétaire et les droits du langage ne sont pas modifiés et toutes fonctions existantes créées dans le langage sont supposées être toujours valides. En plus des droits nécessaires pour créer un langage, un utilisateur doit être superutilisateur ou propriétaire du langage existant. Le cas REPLACE a pour but principal d'être utilisé pour s'assurer que le langage existe. Si le langage a une entrée pg_pltemplate alors REPLACE ne modifiera rien sur la définition existante, sauf dans le cas inhabituel où l'entrée pg_pltemplate a été modifiée depuis que le langage a été créé.
TRUSTED indique que le langage ne donne pas accès aux données auquel l'utilisateur n'a pas normalement accès. Si ce mot clé est omis à l'enregistrement du langage, seuls les superutilisateurs peuvent utiliser ce langage pour créer de nouvelles fonctions.
Sans objet.
Le nom du nouveau langage procédural. Il ne peut y avoir deux langages portant le même nom au sein de la base de données.
Pour des raisons de compatibilité descendante, le nom doit être entouré de guillemets simples.
gestionnaire_appel est le nom d'une fonction précédemment enregistrée. C'est elle qui est appelée pour exécuter les fonctions du langage procédural. Le gestionnaire d'appels d'un langage procédural doit être écrit dans un langage compilé, tel que le C, avec la convention d'appel version 1 et enregistré dans PostgreSQL™ comme une fonction ne prenant aucun argument et retournant le type language_handler, type servant essentiellement à identifier la fonction comme gestionnaire d'appels.
gestionnaire_en_ligne est le nom d'une fonction déjà enregistrée qui sera appelée pour exécuter un bloc de code anonyme (voir la commande DO(7)) dans ce langage. Si aucune fonction gestionnaire_en_ligne n'est indiquée, le langage ne supporte pas les blocs de code anonymes. La fonction de gestion doit prendre un argument du type internal, qui sera la représentation interne de la commande DO, et il renverra le type void. La valeur de retour du gestionnaire est ignorée.
fonction_validation est le nom d'une fonction précédemment enregistrée. C'est elle qui est appelée pour valider toute nouvelle fonction écrite dans ce langage. Si aucune fonction de validation n'est spécifiée, alors toute nouvelle fonction n'est pas vérifiée à sa création. La fonction de validation prend obligatoirement un argument de type oid, OID de la fonction à créer, et renvoie par convention void.
Une fonction de validation contrôle généralement le corps de la fonction pour s'assurer de sa justesse syntaxique mais peut également vérifier d'autres propriétés de la fonction (l'incapacité du langage à gérer certains types d'argument, par exemple). Le signalement d'erreur se fait à l'aide de la fonction ereport(). La valeur de retour de la fonction est ignorée.
L'option TRUSTED et le(s) nom(s) de la fonction de support sont ignorés s'il existe une entrée dans la table pg_pltemplate pour le nom du langage spécifié.
Le programme createlang(1) est un simple enrobage de la commande CREATE LANGUAGE. Il facilite l'installation des langages procéduraux à partir de la ligne de commande du shell.
DROP LANGUAGE(7), ou mieux, le programme droplang(1) sont utilisés pour supprimer des langages procéduraux.
Le catalogue système pg_language (voir Section 45.27, « pg_language ») contient des informations sur les langages installés. De plus, createlang dispose d'une option pour lister ces langages.
Pour créer des fonctions dans un langage procédural, l'utilisateur doit posséder le droit USAGE pour ce langage. Par défaut, USAGE est donné à PUBLIC (c'est-à-dire tout le monde) pour les langages de confiance. Ce droit peut être révoqué si nécessaire.
Les langages procéduraux sont installées par base. Néanmoins, un langage peut être installé dans la base de données template1, ce qui le rend automatiquement disponible dans toutes les bases de données créées par la suite.
Le gestionnaire d'appels, le gestionnaire en ligne (s'il y en a un) et la fonction de validation (s'il y en a une) doivent exister préalablement si le serveur ne possède pas d'entrée pour ce langage dans pg_pltemplate. Dans le cas contraire, les fonctions n'ont pas besoin de pré-exister ; elles sont automatiquement définies si elles ne sont pas présentes dans la base de données. (Cela peut amener CREATE LANGUAGE à échouer si la bibliothèque partagée implémentant le langage n'est pas disponible dans l'installation.)
Dans les versions de PostgreSQL™ antérieures à 7.3, il était nécessaire de déclarer des fonctions de gestion renvoyant le type opaque, plutôt que language_handler. Pour accepter le chargement d'anciens fichiers de sauvegarde, CREATE LANGUAGE accepte toute fonction retournant le type opaque mais affiche un message d'avertissement et modifie le type de retour de la fonction en language_handler.
Tout langage procédural standard sera préférentiellement créé ainsi :
CREATE LANGUAGE plperl;
Pour un langage inconnu du catalogue pg_pltemplate, une séquence comme celle-ci est nécessaire :
CREATE FUNCTION plsample_call_handler() RETURNS language_handler AS '$libdir/plsample' LANGUAGE C; CREATE LANGUAGE plsample HANDLER plsample_call_handler;