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

Interfaces de programmation Oracle Discussion :

[OCILIB] Allocation de handle de statement


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 54
    Points : 67
    Points
    67
    Par défaut [OCILIB] Allocation de handle de statement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OCILib: 3.9.2
    Oracle client/serveur: v8.1
    Système: Windows 7 / VS2010
    A l'exécution d'un programme de test comprenant les instructions suivantes:
    - OCI_ConnectionCreate
    - OCI_StatementCreate
    - OCI_Prepare
    - OCI_Execute
    - OCI_GetResultset
    Je reçois les mêmes erreurs décrites dans ce post.
    Je les recopie ici pour ceux qui feraient une recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
      code: ORA-0
      msg :
     
      code: ORA-0
      msg : The statement must be prepared TO perform this operation
     
      code: ORA-0
      msg : The statement must be described TO perform this operation
    Malheureusement, je ne peux changer de version, cas dans lequel le problème n'existait plus pour ce développeur.
    En debuggant dans les sources d'ocilib, j'ai pu remarquer que dans OCI_Prepare, je ne passais pas dans cet appel d'OCI_HandleAlloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        #if OCI_VERSION_COMPILE < OCI_9_2
     
    		if(OCILib.version_runtime < OCI_9_2)
    		{
    			/* allocate handle */
     
    			res = (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) stmt->con->env,
    				(dvoid **) (void *) &stmt->stmt,
    				(ub4) OCI_HTYPE_STMT,
    				(size_t) 0, (dvoid **) NULL));
    		}
     
         #endif
    Ce qui est logique, puisqu'en compilant pour Windows, OCI_VERSION_COMPILE est égal à OCI_11_2. Du coup on ne teste pas la version runtime.
    De ce fait, on appelle ensuite un OCI_Execute avec un handle de statement à null.
    Je ne me suis pas renseigné, mais je devine que cet appel n'est pas nécessaire pour les versions supérieures ou égales à 9.2 (d'où les if), mais dans mon cas (compilation sous Windows avec la 8.1), il faudrait.
    J'ai donc modifié le #if en:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #if OCI_VERSION_COMPILE < OCI_9_2 || defined OCI_IMPORT_RUNTIME
    pour que sous Windows dans tous les cas on teste la version runtime, puisqu'on ne connait pas la version à la compilation. Tout semble fonctionné correctement.

    Est-ce bien la bonne modification à faire sans compromettre la stabilité de la lib?

    Par ailleurs, reprenant du code écrit avec les appels de fonction d'OCI, la lib OCILib est un vrai bonheur!

  2. #2
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    Salut,


    En fait, tu as complétement raison ! C'est dernieres releases, j'ai oublié de passer mes unit test avec des client Oracle 8i.... ooops !

    le #ifdef en question est à supprimer !

    ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
       if (res == TRUE)
        {
            /* store SQL */
     
            stmt->sql = mtsdup(sql);
     
            ostr = OCI_GetInputMetaString(stmt->sql, &osize);
     
            if (OCILib.version_runtime < OCI_9_2)
            {
                /* allocate handle */
     
                res = (OCI_SUCCESS == OCI_HandleAlloc((dvoid *) stmt->con->env,
                                                      (dvoid **) (void *) &stmt->stmt,
                                                      (ub4) OCI_HTYPE_STMT,
                                                      (size_t) 0, (dvoid **) NULL));
            }
        }
    Je vais inclure ce fix dans la v3.9.3

    Merci pour avoir remonteé le bug !
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 307
    Points
    5 307
    Par défaut
    v3.9.3 releasée
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2011
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2011
    Messages : 54
    Points : 67
    Points
    67
    Par défaut
    Super, merci!

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

Discussions similaires

  1. [Ocilib] Explication Fuite de handle
    Par yves042 dans le forum Oracle
    Réponses: 4
    Dernier message: 25/08/2010, 14h34
  2. [Oracle] ORA-24337: statement handle not prepared
    Par navis84 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 04/10/2006, 14h08
  3. Allocation de ressources
    Par Eric Pasquier dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 08/10/2002, 09h19
  4. pb de récup de handle à partir d'une dll
    Par yokito dans le forum Langage
    Réponses: 2
    Dernier message: 20/08/2002, 12h29
  5. pb de handle en C
    Par deedje dans le forum C
    Réponses: 3
    Dernier message: 21/06/2002, 16h19

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