CREATE LANGUAGE — Définir un nouveau langage procédural
CREATE [ OR REPLACE ] [ PROCEDURAL ] LANGUAGEnom
CREATE [ OR REPLACE ] [ TRUSTED ] [ PROCEDURAL ] LANGUAGEnom
HANDLERgestionnaire_appel
[ VALIDATORfonction_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,
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 41 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
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.
PROCEDURAL
Sans objet.
nom
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.
HANDLER
gestionnaire_appel
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.
INLINE
gestionnaire_en_ligne
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)
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.
VALIDATOR
fonction_validation
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é.
Utiliser DROP LANGUAGE pour supprimer un langage procédural.
Le catalogue système pg_language
(voir
Section 51.29) contient des informations sur les langages
installés. De plus, la commande psql
\dL
liste les langages installées.
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;
CREATE LANGUAGE
est une extension de
PostgreSQL.