Ensemble Firebird Doc → Firebird Docs → 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.
Ensemble Firebird Doc → Firebird Docs → Guide Firebird et NULL → NULL dans les UDFs |