Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2011, 15h15   #1
Invité de passage
 
Homme Vincent Ravier
Développeur informatique
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vincent Ravier

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

Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
Par défaut [OCILIB] Allocation de handle de statement

Code :
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 :
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 :
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 :
#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!
vravier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 20h49   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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 :
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/12/2011, 19h33   #3
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
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
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 08h42   #4
Invité de passage
 
Homme Vincent Ravier
Développeur informatique
Inscription : décembre 2011
Messages : 8
Détails du profil
Informations personnelles :
Nom : Homme Vincent Ravier

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

Informations forums :
Inscription : décembre 2011
Messages : 8
Points : 0
Points : 0
Super, merci!
vravier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h51.


 
 
 
 
Partenaires

Hébergement Web