FreeAdhocUDF pour InterBase et FireBird in deutschin englishen français
homeprevious pagecontentnext pagelast page Mailing-Liste • mailinglist • liste de diffusionwas ich vermisse • what I missed •eMail Kommentar • eMail commentprint
Traitement de <null> dans FireBird 2.0

Dans FireBird 2.0 – et ici aussi – il se peut que des fonctions UDF renvoient <null> au lieu de ‹0› ou une chaîne vide. C’est le cas, par exemple de la requête SQL suivante
    SELECT F_LEFT(NULL, 5) FROM RDB$DATABASE
qui renvoyait jusqu’ici une chaîne vide, ce qui était à vrai dire incorrect. Le retour correct aurait été ici <null>.
Pour conserver le comportement précédent – si on le désire – il est possible d’établir un comportement ALTERNATIF en FireBird 2.0 en modifiant la déclaration.
Pour cela, on déclare par exemple
    DECLARE EXTERNAL FUNCTION F_LEFT
    CSTRING(254),
    INTEGER
    RETURNS CSTRING(254) FREE_IT
    ENTRY_POINT 'left' MODULE_NAME 'FreeAdhocUDF'
ce qui donnera comme précédemment une chaîne vide pour une entrée <null>
Si par contre, on déclare
    DECLARE EXTERNAL FUNCTION F_LEFT
    CSTRING(254) NULL,
    INTEGER NULL
    RETURNS CSTRING(254) FREE_IT
    ENTRY_POINT 'left' MODULE_NAME 'FreeAdhocUDF'
la fonction livrera <null> pour une entrée <null>.
À ce sujet, consultez aussi les Release Notes de FireBird 2.0.
 
Nous avons adapté toutes les fonctions UDF en prévoyant un ou plusieurs paramètres pour rendre possible cette alternative.
Par défaut, toutes les sorties de fonctions seront comme avant. Ce n’est que si la déclaration est modifiée ou si un point d’entrée (Entry point) est modifié que la sortie <null> sera possible.
Par défaut, si au moins un des paramètres d’entrée est <null>, la sortie sera aussi <null>.
Dans le cas d’autres configurations livrant <null> où des variantes existent pouvant aussi renvoyer <null>, le signe * est utilisé pour marquer la fonction correspondante dans le liste.
  
Pour adapter les bases de données existantes à ce comportement modifié, on doit supprimer les fonctions UDF concernées et les déclarer à nouveau. Souvent, cela n’est pas possible car une fonction liée par des contraintes ne pourra pas être supprimée. Il reste la possibilité d’utiliser UPDATE sur la table système RDB$FUNCTION_ARGUMENTS pour rendre la modification effective.
Pour cela, la valeur de RDB$MECHANISM doit être fixée à 5 pour les paramètres concernés par la fonctionnalité NULL, dans le cas présent, les paramètres 1 et 2. UPDATE apparaît alors ainsi pour notre exemple :
    UPDATE RDB$FUNCTION_ARGUMENTS
    SET RDB$MECHANISM = 5
    WHERE RDB$FUNCTION_NAME = 'left'
    AND RDB$ARGUMENT_POSITION IN (1, 2);
Si l’on a affaire à un grand nombre de fonctions, il faut adopter une méthode globale pour mettre en œuvre les modifications.
L’instruction "RETURN INTEGER BY VALUE" devra par exemple être remplacée par ‹RETURN INTEGER FREE_IT›, même si la sortie <null> n’est pas utilisée. En effet, la déclaration avec ‹BY VALUE› ne fonctionne plus.
Le plus simple est alors de supprimer les anciennes fonctions UDF et d’utiliser le script pour les déclarer à nouveau.
Dans les cas critiques, des scripts adéquats peuvent être téléchargés : Download
vorige Seite • previous page • passée sitenach oben • go top • vers le hautnächste Seite • next page • prochain site