Newsgroup: it.comp.software.database
Titolo: db firebird: problema nell'utilizzo di una udf

Ho un problema nell'utilizzo di una udf. In particolare devo utilizzare
l'elevamento a potenza e la funzione che ho trovato è  dpower(p1, p2).
Dichiaro la funzione con il seguente codice:
DECLARE EXTERNAL FUNCTION DPOWER
Double precision, Double precision
RETURNS Double precision
ENTRY_POINT 'power'
MODULE_NAME 'fbudf';
ottenendo risposta positiva dal database.
Successivamente ottengo sempre valore null nell'utilizzo della
funzione.
Ho poi pensato che il problema possa essere nella libreria fbudf.dll,
forse nell'indicazione della directory in cui si trova la libreria, ma
non so come risolvere.
Una qualunque funzione presente in ib_udf.dll, invece, funziona
correttamente con il relativo codice di dichiarazione, analogo a quello
riportato sopra.
spero nel vostro aiuto...... :-(
# vbaRstat #

 non so come risolvere.
Prova a mettere un path assoluto. Personalmente ho utilizzato una libreria
UDF una sola volta, e quindi non so dire se cosi` risolvi...
Enrico

Enrico  Henryx  Bianchi ha scritto:

Con path assoluto intendi il percorso completo della directory in cui
si trova la dll (C:\....) ? Se così ho già fatto ma il risultato è
sempre lo stesso :-(
La cosa strana è che ora sto lavorando sulla mia macchina (sist
operativo: Windows) con un db in locale e le funzioni della libreria
non funzionano.
Nello stesso tempo abbiamo un server su cui gira firebird con linus
come sistema operativo, e le interrogazioni su server che prevedono
l'utilizzo delle udf giungono tutte a buon fine.
Ho l'impressione che ci siano delle differenze nella gestione delle
librerie in base al sistema operativo.
Su internet non ho trovato niente (tranne qualcosa in russo), spero
qualcuno possa aiutarmi.
# vbaRstat #

 qualcuno possa aiutarmi.
Non e' che state mischiando dll di release con dll di debug? Su
windows una situazione del genere, normalmente, genera casino.
C:\>iao Angelo
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 spero nel vostro aiuto...... :-(
Ho provato ed effettivamente mi da il tuo risultato:
select dpower(5,2) from RDB$DATABASE
Risultato= Null
Firebird Ver. 1.5.3.4870

 
Le UDF Firebird le cerca sempre nel percorso relativo 
<Directory_di_installazione>\UDF.
Per quanto riguarda la funzione dpower la dichiarazione č sbagliata.
Se guardi all'interno del file fbudf.sql che si trova all'interno della 
cartella UDF del percorso di installazione di Firebird vedrai che per 
usare la funzione dpower devi scrivere:
declare external function dPower
double precision by descriptor, double precision by descriptor,
double precision by descriptor
returns parameter 3
entry_point 'power' module_name 'fbudf';
Saluti
Massimo

 Massimo
Caro massimo ti ringrazio per la segnalazione.
Hai effettivamente ragione, dichiarando la funzione con il codice da te
riportato il tutto funziona!!!!
La cosa strana è che il codice riportato da me in questa discussione
era copiato dalla dichiarazione della stessa funzione su di un db
residente su server in cui gira linux, ed in cui la funzione dpower()
funziona!!!!
Nello stesso tempo mi/vi chiedo come mai nella dichiarazione corretta
si parla di "returns parameter 3" ? il parametro di ritorno è uno, ma
forse si intende il fatto che i parametri sono tre, due di input ed uno
di otuput? Cmq leggo un po' la guida e poi magari ne discutiamo.
l'importante è che  il problema sia risolto, grazie.
# vbaRstat #

Da una veloce osservazione del db ho capito l'errore che commettevo.
A volte mi è capitato di lavorare su di un db firebird dal quale ho
dovuto "prendere" alcune tabelle e procedure. Quello che facevo era
semplicemente copiare il codice SQL presente nella DDL associata alla
tab o alla proc (eventualmente adattandolo alle mie esigenze).
Pensando di poterlo fare, copiavo anche il codice della funzione
dpower().
Ebbene, mentre il codice corretto per la dichiarazione è:
declare external function dPower
double precision by descriptor, double precision by descriptor,
double precision by descriptor
returns parameter 3
entry_point 'power' module_name 'fbudf';
successivamente, nella DDL associata a tale funzione, si leggerà:
DECLARE EXTERNAL FUNCTION DPOWER
Double precision, Double precision
RETURNS Double precision
ENTRY_POINT 'power'
MODULE_NAME 'fbudf';
che appunto non può essere utilizzato per dichiare la funzione.
Non so se si tratti di una cosa normale e risaputa, ma io da inesperto
non ne ero a conoscenza :-)
ciao
# vbaRstat #