pour InterBase et FireBird | ||
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 |
||