Documenti Firebird → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Gestione dei NULL nelle UDF |
Le funzioni definite dell'utente, o UDF (User Defined Functions) sono funzioni che non sono interne al motore, ma definite in moduli separati. Firebird arriva con due librerie UDF: ib_udf (che è stata ereditata da InterBase) e fbudf. Si possono aggiungere altre librerie, comprandole o scaricandole da internet, oppure scrivendosele in un qualche linguaggio di programmazione idoneo. Le UDF non possono essere usate così come sono; devono essere prima “dichiarata” al database. Questo è vero anche per le UDF che vengono con Firebird.
Non fa parte degli scopi di questa guida insegnare, usare o scrivere le UDF. Tuttovia è necessario avvertire che le UDF possono occasionalmente effettuare inaspettatamente delle conversioni a e da NULL. Questo comporta che alle volte un NULL in input possa essere convertito in un valore regolare particolare, ed altre volte che un valore valido come una stringa vuota venga nullificato.
La causa principale di questo problema è che il modo di chiamare le UDF di “vecchio tipo” non è in grado di passare un NULL in input ad una funzione. Quando una funzione UDF quale ad esempio LTRIM (elimina gli spazi eccedenti a sinistra) viene chiamata con un argomento NULL, l'argomento viene passato alla funzione come una stringa vuota. Dall'interno della funzione non esiste nessun modo per determinare se l'argomento è veramente una stringa vuota oppure un NULL. Pertanto che dovrebe fare che scrive la routine? Deve fare una scelta: o prendere il valore come gli arriva o assumere che fosse originariamente un NULL e trattarlo di conseguenza.
In funzione del tipo di risultato, potrebbe essere possibile riportare NULL anche quando non possibile ricevere NULL. A tal punto che potrebbero accadere i seguenti fenomeni inattesi:
È possibile chiamare una UDF con un argomento a NULL. Viene passato alla funzione con un valore, cioè 0 oppure ''. All'interno della funzione questo valore non è ricambiato in NULL; pertanto viene riportato un risultato non-NULL.
Se si chiama una UDF con un argomento valido come 0 oppure '', questo viene passato come è, ovviamente. Ma il codice della funzione suppone che sia invece la rappresentazione di un NULL, lo tratta come un buco nero, e riporta al chiamante un NULL.
Entrambe le conversioni sono normalmente indesiderate, ma la seconda probabilmente lo è di più della prima (è meglio validare qualcosa che è NULL piuttosto che NULLificare qualcosa di valido). Per tornare al nostro esempio della LTRIM: fino alla versione di Firebird 1.0.3 compresa, questa funzione riportava NULL per una stringa vuota; dalla versione 1.5, non riporta più NULL. In questa versione, le stringhe NULL sono cambiate in stringhe vuote. Intediamoci, è sbagliato, ma è considerato il minore dei due mali: nella precedente situazione le stringhe valide (vuote) sarebbe state convertite senza pietà alcuna in NULL.
Le conversioni non richieste descritte sopra normalmente accadono con le UDF compatibili, ma ce ne sono molte in giro (sopratutto nella ib_udf). Inoltre nulla può fermare un programmatore superficiale dal ricadere nello stesso errore in una funzione nel nuovo stile. Pertanto il comportamento più sicuro da tenere se si usa una UDF e non si conosce come si comporta nei confronti del NULL:
guardare alla sua dichiarazione per controllare come sono passati e riportati i suoi valori. Se dice “by descriptor”, si comporta in modo corretto (sebbene non fa mai male assicurarsene). In tutti gli altri casi, verificate i passi seguenti.
Avendone i sorgenti, e sapendo leggere il codice sorgente (C, C++, Delphi,...) controllare cosa fa il codice della funzione.
Valutare la funzione con valori NULL e con valori come 0 (per argomenti numerici) e/o '' (per stringhe).
Se la funzione effettua una conversione indesiderata NULL <-> non-NULL, bisogna girarci intorno nel proprio codice prima di chiamare la UDF (vedere anche Come controllare se ci sono NULL, altrove in questa guida).
Le dichiarazioni per le UDF rilasciate possono essere trovate nel sottodirettorio bin/examples (per la versione 1.0) oppure bin/UDF (dalla versione 1.5 in poi): si trovano nei files con estensione .sql
Per ottenere informazioni più approfondite sulle UDF, si può consultare i documenti (al momento tutti in inglese) InterBase 6.0 Developer's Guide (gratuito, scaricabile da http://www.ibphoenix.com/downloads/60DevGuide.zip), Using Firebird e la Firebird Reference Guide (entrambi su CD), oppure il Firebird Book. I CD ed il libro possono essere acquistati attraverso http://www.ibphoenix.com.
Documenti Firebird → Guida sull'uso di NULL nel linguaggio SQL di Firebird → Gestione dei NULL nelle UDF |