Firebird Documentation Index → Guide Firebird et NULL → NULL dans les UDFs |
UDF (User Defined
Functions) sont des fonctions qui ne sont pas internes au
moteur, mais définies dans des modules séparés. Firebird est livré avec
deux bibliothèques UDF : ib_udf
(héritée d' InterBase) et fbudf
. Vous pouvez ajouter d'autres
bibliothèques, e.g. en les achetant ou les téléchargeant, ou en les
écrivant vous même. Les UDF ne peuvent être utilisées directement; elles
doivent être « déclarées » dans la base d'abord. Ceci est aussi
vrai pour les UDF livrées avec Firebird.
Vous apprendre à déclarer, utiliser, et écrire des UDFs est hors
du champ de ce guide. Toutefois, nous devons vous prévenir que les UDFs
peuvent quelques fois effectuer des conversions de
NULL
non désirées. Cela va quelques fois convertir
des entrées NULL
en des valeurs régulières, et
quelque fois rendre NULL
des entrées valides comme
''
(une chaîne vide).
La cause principale de ce problème est qu'avec l' « ancien
style » d'appel UDF, il n'est pas possible de passer
NULL
comme entrée de fonction. Quand une UDF comme
LTRIM
(left trim) est appelée avec un argument
NULL
, l'argument est passé à la fonction comme une
chaîne vide. A l'intérieur de la fonction, il n'y a
aucune manière de savoir si cet argument représente
réellement une chaîne vide ou un NULL
. Donc que
fait le créateur de la fonction? Il doit choisir: soit prendre
l'argument comme étant une valeur, ou considérer qu'à l'origine s'était
un NULL
et faire le traitement en
conséquence.
En fonction du type de résultat, renvoyer
NULL
peut être possible même si recevoir
NULL
ne l'est pas. Ainsi, les choses non attendues
suivantes peuvent arriver :
Vous appelez une UDF avec un argument
NULL
. Il est passé comme une valeur, e.g. 0 ou
''
. Dans la fonction, cet argument n'est pas
remis à NULL
; un résultat
non-NULL
est renvoyé.
Vous appelle une UDF avec un argument valide comme 0 ou
''
. Il es passé tel quel (manifestement). Mais le
code de la fonction suppose que cette valeur en réalité représente
un NULL
, le traite comme tel, et renvoie
NULL
à l'appelant.
Ces deux conversion sont en général non désirées, mais la seconde
certainement plus que la première (on préfère valider
NULL
que détruire quelque chose de valide). Pour
revenir à notre fonction LTRIM
par exemple: jusqu'à
la version Firebird 1.0.3 incluse, cette fonction renvoyait
NULL
si vous lui donniez une chaîne vide; et depuis
la version 1.5, elle ne renvoie jamais NULL
. Dans
ces versions récentes, les chaînes NULL
sont
« transformées » en chaînes vides. Ce n'est pas vraiment
juste, mais c'est considéré comme la moins mauvaise solution: dans
l'ancienne situation , les chaînes valides (mais vides) étaient sans
merci ramenées à NULL
.
Les conversions nous voulues décrites ci-dessus arrivent
normalement qu'avec les UDFs héritées d'Interbase, mais il en existe
beaucoup (essentiellement dans ib_udf
). De même, rien n'empêchera un autre
développeur de faire la même chose dans une nouvelle fonction. Donc la
règle est: si vous utilisez une UDF et que vous savez pas comment elle
se comporte avec NULL
:
Regardez sa déclaration pour voir comment les valeurs sont passées et retournées. S'il est écrit « by descriptor », cela devrait aller (même si on ne peut en être certain). Dans tous les autres cas, suivez les instructions suivantes.
Si vous avez les sources et que vous savez les lire, regardez le code de la fonction.
Testez la fonction avec des entrées NULL
et des entrées comme 0 (pour les arguments numériques) et/ou
''
(pour les chaînes de caractères).
Si la fonction effectue une conversion non désirée de
NULL
<-> non-NULL
,
vous devrez en tenir compte dans votre code avant d'utiliser l'UDF
(voir aussi Tester si
quelque chose est NULL
, dans ce
guide).
Les déclarations pour les bibliothèques UDF livrées avec Firebird
se trouvent dans le sous répertoire de Firebird bin/examples
(v. 1.0) ou bin/UDF
(v. 1.5 et suivantes). Regardez les
fichiers avec l'extension .sql
Pour en savoir plus sur les UDF, consultez InterBase 6.0 Developer's Guide (disponible gratuitement à http://www.ibphoenix.com/downloads/60DevGuide.zip), Using Firebird et le Firebird Reference Guide (les deux sur CD), ou le Firebird Book. Les CD et le livre peuvent être achetés chez http://www.ibphoenix.com.
Firebird Documentation Index → Guide Firebird et NULL → NULL dans les UDFs |