23.2.2 Ajouter une nouvelle fonction définie par l'utilisateur ( UDF )
23.2 Ajouter des fonctions à MySQL
23 Etendre MySQL
Manuel de Référence MySQL 4.1 : Version Française
. Fonctions utilisateur : appeler des fonctions simples . Appeler des fonctions utilisateurs pour les groupements ->Traitement des arguments . Valeurs de retour et gestion d'erreurs. . Compiler et installer des fonctions utilisateurs
|
23.2.2.3 Traitement des arguments
Le paramètre
args
pointe sur une structure
UDF_ARGS
qui dispose des membre
suivants :
-
unsigned int arg_count
-
Le nombre d'arguments. Vérifiez cette valeur dans la fonction d'initialisation,
si vous voulez que votre fonction soit appelée avec un nombre particulier d'arguments.
Par exemple :
if (args->arg_count != 2) { strcpy(message,"XXX() requires two arguments"); return 1; }
|
-
enum Item_result *arg_type
-
Le type de chaque argument. Les valeurs possibles pour chaque type sont
STRING_RESULT
,
INT_RESULT
et
REAL_RESULT
.
Pour s'assurer que les arguments sont d'un type donné, et retourner une erreur
dans le cas contraire, vérifiez le tableau
arg_type
durant la fonction
d'initialisation. Par exemple :
if (args->arg_type[0] != STRING_RESULT || args->arg_type[1] != INT_RESULT) { strcpy(message,"XXX() requires a string and an integer"); return 1; }
|
Comme alternative à l'imposition d'un type particulier pour les arguments des
fonctions, vous pouvez utiliser la fonction pour qu'elle modifie le type des arguments
et donne aux valeurs de
arg_type
le type que vous souhaitez. Cela fait que
MYSQL va forcer les arguments à un type donnée, pour chaque appel de la fonction
xxx()
. Par exemple, pour forcer le type des deux premiers arguments en
chaîne et entier, vous pouvez utiliser la fonction d'initialisation
xxx_init()
:
args->arg_type[0] = STRING_RESULT; args->arg_type[1] = INT_RESULT;
|
-
char **args
-
args->args
communique les informations à la fonction d'initialisation,
ainsi que la nature des arguments avec laquelle elle a été appelée. Pour un
argument constant
i
,
args->args[i]
pointe sur la valeur de l'argument.
Voir plus bas pour les instructions d'accès à cette valeur. Pour les valeurs
non constantes,
args->args[i]
vaut
0
. Un argument constant est une
expression qui utilise des constantes, comme
3
ou
4*7-2
ou
SIN(3.14)
.
Un argument non-constant est une expression qui fait référence aux valeurs qui peuvent
changer de ligne en ligne, par exemple des noms de colonnes ou des fonctions
qui sont appelées avec des arguments non-constants.
Pour chaque invocation de la fonction principale,
args->args
contient les
arguments réels qui sont passés à la ligne qui sera traitée.
Les fonctions peuvent faire référence à un argument
i
comme ceci :
-
Un argument de type
STRING_RESULT
est donné sous la forme d'un pointeur de chaîne,
plus une longueur, pour permettre la gestion des données binaires ou des données de taille
arbitraire. Le contenu des chaînes est disponible avec l'expression
args->args[i]
et la taille de la chaîne est
args->lengths[i]
. Ne supposez pas que les chaînes sont
terminés par le caractère nul.
-
Pour un argument de type
INT_RESULT
, vous devez transtyper la valeur
args->args[i]
en valeur
long long
:
long long int_val; int_val = *((long long*) args->args[i]);
|
-
Pour un argument de type
REAL_RESULT
, vous devez transtyper la valeur
args->args[i]
en valeur
double
:
double real_val; real_val = *((double*) args->args[i]);
|
-
unsigned long *lengths
-
Pour une fonction d'initialisation, le tableau
lengths
indique
la taille maximale des chaînes pour chaque argument. Vous ne devez pas les
modifier. Pour chaque appel de la fonction principale,
lengths
contient
la taille réelle de toutes les chaînes arguments qui sont passé pour la ligne
traitée. Pour les arguments de type
INT_RESULT
ou
REAL_RESULT
,
lengths
contient toujours la taille maximale de l'argument
(comme pour la fonction d'initialisation).
|