| 24.2.2 Ajouter une nouvelle fonction définie par l'utilisateur ( UDF )
 24.2 Ajouter des fonctions à MySQL
 24 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
 
 
 | 
  24.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 : 
 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()
  :| 
if (args->arg_type[0] != STRING_RESULT ||args->arg_type[1] != INT_RESULT)
 {
 strcpy(message,"XXX() requires a string and an integer");
 return 1;
 }
 | 
 | 
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).      |