36.2. Fonctions et arguments PL/Tcl

Pour cr�er une fonction dans le langage PL/Tcl, utilisez la syntaxe standard :

CREATE FUNCTION nom_fonction (types_arguments) RETURNS
type_en_retour AS $$
    # corps de la fonction PL/Tcl
$$ LANGUAGE pltcl;

PL/TclU est identique sauf que le langage doit �tre pltclu.

Le corps de la fonction est simplement un bout de script Tcl. Quand la fonction est appel�e, les valeurs des arguments sont pass�es en tant que variables $1 ... $n au script Tcl. Le r�sultat est renvoy� � partir du code Tcl de la fa�on habituelle avec une instruction return.

Par exemple, une fonction renvoyant le plus grand de deux valeurs enti�res pourrait �tre d�finie ainsi :

CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
    if {$1 > $2} {return $1}
    return $2
$$ LANGUAGE pltcl STRICT;

Notez la clause STRICT qui nous permet d'�viter de penser aux valeurs NULL en entr�es : si une valeur NULL est pass�e, la fonction ne sera pas appel�e du tout mais renverra automatiquement un r�sultat nul.

Dans une fonction non stricte, si la valeur r�elle d'un argument est NULL, la variable $n correspondante sera initialis�e avec une cha�ne vide. Pour d�tecter si un argument particulier est NULL, utilisez la fonction argisnull. Par exemple, supposez que nous voulons tcl_max avec un argument NULL et un non NULL pour renvoyer l'argument non NULL plut�t que NULL :

CREATE FUNCTION tcl_max(integer, integer) RETURNS integer AS $$
    if {[argisnull 1]} {
        if {[argisnull 2]} { return_null }
        return $2
    }
    if {[argisnull 2]} { return $1 }
    if {$1 > $2} {return $1}
    return $2
$$ LANGUAGE pltcl;

Comme indiqu� ci-dessus, pour renvoyer une valeur NULL � partir d'une fonction PL/Tcl, ex�cutez return_null. Ceci peut �tre fait que la fonction soit stricte ou non.

Les arguments de type compos� sont pass�s � la fonction comme des tableaux Tcl. Les noms des �l�ments du tableau sont les noms d'attribut du type composite. Si un attribut dans la ligne pass�e a la valeur NULL, il n'appara�tra pas dans le tableau. Voici un exemple :

CREATE TABLE employe (
    nom text,
    salaire integer,
    age integer
);

CREATE FUNCTION surpaye(employe) RETURNS boolean AS $$
    if {200000.0 < $1(salaire)} {
        return "t"
    }
    if {$1(age) < 30 && 100000.0 < $1(salaire)} {
        return "t"
    }
    return "f"
$$ LANGUAGE pltcl;

Il n'y a actuellement aucun support pour le retour d'une valeur r�sultat de type compos� et pour le retour d'ensembles.

PL/Tcl n'a pas actuellement du support complet pour les types de domaine : il traite un domaine de la m�me fa�on que le type scalaire sous-jacent. Cela signifie que les contraintes associ�es avec le domaine ne seront pas forc�es. Ce n'est pas un probl�me pour les arguments de la fonction mais c'est hasardeux de d�clarer une fonction PL/Tcl renvoyant un type domaine.