CREATE FUNCTION

Name

CREATE FUNCTION -- définit une nouvelle fonction

Synopsis

CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
    RETURNS rettype
    AS 'definition'
    LANGUAGE langname
    [ WITH ( attribute [, ...] ) ]
CREATE [ OR REPLACE ] FUNCTION name ( [ argtype [, ...] ] )
    RETURNS rettype
    AS 'obj_file', 'link_symbol'
    LANGUAGE langname
    [ WITH ( attribute [, ...] ) ]

Description

CREATE FUNCTION définit une nouvelle fonction. CREATE OR REPLACE FUNCTION soit créera une nouvelle fonction, soit remplacera une définition existante.

Parameters

name

Nom d'une fonction à créer. Le nom ne nécessite pas d'être unique, car les fonctions peuvent être surchargées, mais les fonctions de nom identique doivent avoir des arguments types différents.

argtype

Le(s) type(s) de l'argument de la fonction. Les types entrée peuvent être basés sur des types complexes, opaque, ou le même que le type d'une colonne existante. Opaque indique que la fonction accepte des arguments de type non-SQL comme char *. Le type d'une colonne est insiqué en utilisant tablename.columnname%TYPE; utiliser ceci peut parfois aider à rendre indépendante une fonction des changements de définition d'une table.

rettype

Le type de retour. Le type sortie peut être spécifié comme type de base, type complexe, type setof, opaque, ou le même que le type d'une colonne existante. Le modificateur setof indique que la fonction retournera un ensembles d'items plutôt qu'un simple item. Les fonctions avec un type de retour déclaré opaque ne renvoient pas une valeur. Elles ne peuvent être appelées directement; les fonctions déclencheur font usage de cette fonctionnalité.

definition

Une chaîne définissant la fonction; ce comportement dépend du langage. Il peut être un nom de fonction interne, le chemin vers un fichier objet, une requête SQL, ou du texte en langage procédural.

obj_file, link_symbol

La forme de la clause AS est utilisée pour lier dynamiquement les fonctions du langage C quand le nom de fonction dans le code source du langage C n'est pas le même que le nom de la fonction SQL. La chaîne obj_file est le nom de fichier contenant l'objet dynamiquement chargeable, et link_symbol est le symbole du lien de l'objet, qui est, le nom de la fonction dans le code source du langage C.

langname

Peut être SQL, C, internal, ou plname, où plname est le nom d'un langage procédural créé. Voir CREATE LANGUAGE pour les détails. Pour des questions de compatibilité, le nom peut être inséré entre parenthèses.

attribute

Une partie optionnelle de l'information sur la fonction, utilisée pour l'optimisation. Voir ci-dessous pour les détails.

L'utilisateur qui crée la fonction en devient le propriétaire.

Les attributs suivants peuvent apparaître dans la clause WITH :

iscachable

Iscachable indique que la fonction retourne toujours le même résultat quand on donne les mêmes valeurs d'argument (i.e., il n'y a pas de consultation de la base ou d'utilisation d'information non directement présente dans la liste de ses paramètres). L'optimiseur utilise iscachable pour savoir si il est sûr de faire une pré-évaluation de l'appel de la fonction.

isstrict

isstrict indique que la fonction renvoit toujours NULL chaque fois qu'un des ses arguments est NULL. Si cet attribut est spécifié, la fonction n'est pas exécutée quand les arguments sont NULL; au lieu de ça un résultat NULL est admis automatiquement. Quand isstrict n'est pas spécifié, la fonction sera appelée pour des entrées NULL. C'est alors de la responsabilité de l'auteur de la fonction de vérifier que les NULL sont nécessaires et appropriés.

Notes

Référez vous au chapitre du Guide du programmeur PostgreSQL sur le sujet des extensions PostgreSQL par les fonctions pour plus d'information sur l'écriture des fonctions externes.

La syntaxe SQL complète est admise pour les arguments entrée et valeurs de retour. Cependant, certains détails de la spécification de type (ex., le champ précision pour les types numeric) sont de la responsabilité de l'implémentation de fonction sous-jacente et sont acceptées sans avertissement par la commande CREATE FUNCTION.

PostgreSQL admet la fonction overloading; ceci étant, le même nom peut être utilisé pour plusieurs fonctions différentes autant qu'elles ont des type d'arguments distincts. Cette facilité doit être utilisée avec précaution pour les fonctions C internes, cependant.

Deux fonctions internal ne peuvent avoir le même nom C sans provoquer des erreurs de liage. Pour y remédier, donnez leurs des noms C différents (par exemple, utilisez les types d'arguments comme partie des noms C), ensuite spécifiez ces noms dans la clause AS de CREATE FUNCTION. Si la clause AS est vide côté gauche, CREATE FUNCTION suppose que le nom C de la fonction est le même que le nom SQL.

De façon similaire, quand vous surchargez des noms de fonction SQL avec des multiples fonctions C, donnez un nom distinct à chaque instance C de la fonction, ensuite utilisez la forme alternative de la clause AS dans la syntaxe de CREATE FUNCTION pour sélectionner l'implémentation du C appropriée de chaque fonction SQL surchargée.

Quand des appels répétés CREATE FUNCTION se réfèrent au même fichier objet, le fichier est chargé une seule fois. Pour décharger et recharger le fichier, utilisez la commande LOAD.

Utilisez DROP FUNCTION pour supprimer des fonctions définies par l'utilisateur (fonctions utilisateur).

Pour mettre à jour la définition d'une fonction existante, utilisez CREATE OR REPLACE FUNCTION. Notez qu'il n'est pas possible de changer le nom ou les types d'arguments d'une fonction par ce moyen (si vous essayez, vous créez simplement une nouvelle fonction, distincte). Aussi, CREATE OR REPLACE FUNCTION ne vous laissera pas changer le type de retour d'une fonction existante. Pour faire ça, vous devez supprimer et recréer la fonction.

Si vous supprimez et recréez une fonction, la nouvelle fonction n'a pas la même entité que l'ancienne; vous briserez les règles existantes, les vues, les déclencheurs, etc. qui se réfèrent à la fonction ancienne. Utilisez CREATE OR REPLACE FUNCTION pour changer une définition de fonction sans casser les objets qui s'y réfèrent.

Exemples

Pour créer une simple fonction SQL :

CREATE FUNCTION one() RETURNS integer
    AS 'SELECT 1 AS RESULT;'
    LANGUAGE SQL;

SELECT one() AS answer;
 answer 
--------
      1

L'exemple suivant crée une fonction C par appel d'une routine d'une bibliothèque partagée créée par l'utilisateur nommée funcs.so (l'extension peut varier selon la plate-forme) Le fichier bibliothèque partagée est recherché dans le chemin des bibliothèques dynamiques du serveur. Cette routine particulière calcule une vérification de chiffres et renvoie TRUE si la vérification dans les paramètres de la fonction est correcte. Il est prévu pour l'utilisation dans une contrainte CHECK.

CREATE FUNCTION ean_checkdigit(char, char) RETURNS boolean
    AS 'funcs' LANGUAGE C;
    
CREATE TABLE product (
    id        char(8) PRIMARY KEY,
    eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
                      REFERENCES brandname(ean_prefix),
    eancode   char(6) CHECK (eancode ~ '[0-9]{6}'),
    CONSTRAINT ean    CHECK (ean_checkdigit(eanprefix, eancode))
);

Cet exemple crée une fonction qui fait une conversion de type entre le type utilisateur complexe, et le type interne point. La fonction est implémentée par un objet chargé dynamiquement compilé depuis le source C. Pour que PostgreSQL trouve automatiquement une fonction de conversion de type, la fonction SQL doit avoir le même nom que le type de retour, et ainsi la surcharge est inévitable. Le nom de fonction est surchargé en utilisant la seconde forme de la clause AS dans la définition SQL :

CREATE FUNCTION point(complex) RETURNS point
    AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
    LANGUAGE C;
La déclaration C de la fonction pourrait être :
Point * complex_to_point (Complex *z)
{
	Point *p;

	p = (Point *) palloc(sizeof(Point));
	p->x = z->x;
	p->y = z->y;
		
	return p;
}

Compatibilité

Une commande CREATE FUNCTION est définie en SQL99. La version PostgreSQL est similaire mais pas compatible. Les attributs ne sont pas portables, et ne sont pas portables dans des langages différents.

Voir aussi

DROP FUNCTION , LOAD, Guide du programmeur PostgreSQL.