IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

Problème mise en oeuvre UDF


Sujet :

SQL Firebird

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 613
    Par défaut Problème mise en oeuvre UDF
    Bonjour.

    j'ai quelques problèmes pour mettre en oeuvre une fonction UDF.

    Ecrite en C j'ai crée une dll que j'ai placé dans un répertoire D:\firebird15BDD de mon disque dur .

    Ci joint la fonction C écrite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    short __stdcall SgbdUdfTestBit( short s_MotATester, short s_Position)
    {
    	return ( (s_MotATester & s_Position) != 0 );	
    }
    J'ai déclaré la fonction dans ma base de données en utilisant un script SQL sous IBEXPERT comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE EXTERNAL FUNCTION SGBDTESTBIT
        SMALLINT,
        SMALLINT
    RETURNS SMALLINT BY VALUE
    ENTRY_POINT 'SgbdUdfTestBit' MODULE_NAME 'D:\Firebird15bdd\SgbdUdf.dll'
    J'appelle ma fonction dans une procedure stockée comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        var_restest = sgbdtestbit(:droitscumules,:var_position_droits);
    Au moment du Commit de la procédure stockée j'obtiens le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Invalid token
    Invalid request BLR at offset 418
    function SGBDTESTBIT is not defined
    module name or entrypoint could not be founded
    .

    Pouvez vous m'aider à trouver ce qui manque à la reconnaissance de ma fonction ?

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    D'après ce qui est mentionné ici : http://www.ibphoenix.com/main.nfs?a=...age=ibp_howto3

    ... essaie de mettre les paramètres ENTRY_POINT & MODULE_NAME entre double-quote

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 613
    Par défaut
    En fait je passe par IBEXPERT qui me génère le script. De cette façon j'arrive à 'déclarer' une UDf , c'est a dire qu'elle apparait bien dans la liste des UDF.

    Je suis arrivé à faire un appel à une UDF au sein d'une procédure stockée, mais les résultats ne sont du tout ceux attendus.

    Plusieurs questions :

    1) dans beaucoup (voire tous) d'exemples d'utilisation d'UDF l'appel de la fonction se fait dans un SELECT, INSERT... mais pas sous la forme de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable = UdfFonction(parametres);
    Cette forme d'utilisation est-elle possible ?


    2) J'ai remarqué qu'aprés avoir effectué une modification dans ma DLL et l'avoir re-installée dans Crogram files\Borland\Interbase\udf cela me générait des erreurs sous IBEXPERT lorsque je faisais des appels à ces UDF ( messages erreur violation accès , etc... )

    Avez vous des informations complémentaires ou avez vous utilisé des UDF de la façon dont je souhaite le faire.

    merci d'avance

  4. #4
    Membre expérimenté Avatar de TMuet
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Septembre 2003
    Messages
    225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2003
    Messages : 225
    Par défaut
    1- Non
    Utilise plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT UdfFonction(parametres) FROM RDB$_DATABASE INTO :variable
    Ca devrait aller mieux !

    2- C'est effectivement le chemin à choisir (cela explique le problème soulevé dans ton premier envoi).
    Les plantages viennent souvent de conversions invalides. Il est souvent délicat d'effectuer des conversions entre types.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 613
    Par défaut
    Personne n'a des idées pour me permettre d'avancer Là je suis sur un point bloquant. Merci.

    Je rappelle ce que j'aimerai savoir :

    1) Peut-on utiliser une UDF sous la forme
    variable = Udf();

    ou est ce que la syntaxe unique est du genre SELECT UDF(), ....

    2) Je souhaiterai connaitre la liste des UDF définies dans IB_UDF.dll. Notamment une fonction IB_AND() m'interesse, on en parle dans la documentation 'Langage réference', mais j'ai l'impression qu'elle est nommée différement dans la librairie.

    MERCI D'AVANCE.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 613
    Par défaut
    Bon, j'ai réussi à mettre en oeuvre les UDF !

    1) les UDF d'Interbase, ou Firebird qui sont dans la librairie ib_udf.dll (c:\Program files\Borland\Interbase\Udf) ont des noms qui ne sont pas forcément en accord avec ce qui est mentionné dans la documentation interbase.

    Par exemple : la documentation Interbase 'Langage Reference', je crois liste les fonctions de cette librairie. On y trouve notamment la fonction "bin_and". Or dans la librairie cette fonction à comme nom réel "ib_udf_bin_and". Ce qui explique pourquoi je ne pouvais l'utiliser.

    Attention donc aux noms réel des fonctions en librairie.

    2) Concernant ma librairie perso, je ne passais pas les parametres par référence, mais par valeur. Depuis je l'ai modifié et peut ainsi utiliser mes fonctions.

    3) Une fonction UDF peut aussi s'utiliser de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var = UDF_Fonction(...);
    Je confirme !

    J'espère que ces quelques informations pourront servir à d'autre utilisateurs Interbase.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/08/2011, 12h48
  2. Problème de mise en oeuvre de managed beann
    Par methodman225 dans le forum JSF
    Réponses: 9
    Dernier message: 09/04/2010, 08h48
  3. Réponses: 1
    Dernier message: 24/03/2008, 15h29
  4. [Oracle 9i] - Problème mise en oeuvre Oracle Names
    Par superfunky dans le forum Oracle
    Réponses: 2
    Dernier message: 16/11/2007, 17h50
  5. [Cewolf] Problème de mise en oeuvre
    Par mat453 dans le forum Struts 1
    Réponses: 1
    Dernier message: 26/09/2007, 17h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo