38.2. Fonctions et arguments PL/Tcl
Pour créer une fonction dans le langage PL/Tcl, utilisez la syntaxe standard de
CREATE FUNCTION :
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.