Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 09h13   #1
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
Par défaut [OCILIB] OCI_GetLastError et requêtes paramétrées

Salut,

j'ai un petit problème avec OCI_GetLastError et les requêtes paramétrées, j'initialise OCILIB avec
Code C :
OCI_Initialize(NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT)
lorsque j'ai une erreur oracle avec une requête non paramétrée j’obtiens bien quelque chose avec OCI_GetLastError, par contre si une requête paramétrée ne passe pas alors OCI_GetLastError me renvoie toujours NULL.
J'ai fait l'essai en utilisant un handler pour la gestion des erreurs et je récupère bien l'erreur lors de l’exécution de la requête paramétrée.
Quelqu'un aurait il une idée du problème ?

Merci d'avance
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 08h33   #2
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
Salut,

Petit exemple ?
__________________
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 09/01/2013, 14h08   #3
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
Salut,

en gros (parce que la gestion de la connexion oracle est encapsulé dans d'autres classes ), j'ai :

Code C :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CString szSql = _T( "UPDATE T_PARAM_EQUIPEMENT SET DATEMODIF=:DATEMODIF, VALEUR=:VALEUR WHERE ID_PARAMETRE=:ID_PARAMETRE AND ID_EQUIPEMENT=:ID_EQUIPEMENT" );
OCI_Statement *st = OCI_StatementCreate(m_database);
OCI_Prepare(st, szSql);
OCI_BindDate( st, _T( ":DATEMODIF" ), d );
OCI_BindString( st, _T( ":VALEUR" ), szValeurParametre, len );
OCI_BindInt( st, _T( ":ID_PARAMETRE" ), piIdParametre );
OCI_BindInt( st, _T( ":ID_EQUIPEMENT" ), piIdEquipement );
 
statut = OCI_Execute(st);
 
if (!statut)
{
	OCI_Error *err = OCI_GetLastError();
 
	// si erreur
	if (err != NULL)
	{
		sErr = _T(" Error : ");
		sErr += BO::iToString (OCI_ErrorGetOCICode(err));
		sErr += _T(" = ");
		sErr += OCI_ErrorGetString(err);
 
		diagnostic += sErr;
	}
}
Lorsque j'utilise OCI_Initialize(NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT) et que le statut vaut faux, err est toujours NULL dans le cas des requêtes paramétrées (mais pas avec des requêtes non paramétrées)
Lorsque j'utilise OCI_Initialize(err_handler, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT), l'erreur est bien catchée et rentre dans la fonction de gestion des erreurs err_handler.

Pour information l'erreur que je récupère souvent dans err_handler correspond à ORA-01480 pourtant ma chaine de caractère possède bien le caractère de fin.
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 21h04   #4
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
Je n'arrive pas a reproduire le soucis. avec une requete paramétrée, j'ai bien une error retournée par OCI_GetLastError() avec le code suivant...

SQL
Code :
1
2
3
4
5
6
7
8
9
10
11
SQL> CREATE TABLE test(value varchar2(10));
 
TABLE crÚÚe.
 
SQL> INSERT INTO test VALUES ('test');
 
1 ligne crÚÚe.
 
SQL> commit;
 
Validation effectuÚe.
C Code :
Code C :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "ocilib.h"
 
void err_handler(OCI_Error *err)
{
    printf("Error : %s\n", OCI_ErrorGetString(err));
}
 
int main(void)
{
    OCI_Connection *cn = NULL;
    OCI_Statement *st = NULL;
    OCI_Error *err = NULL;
 
    char str[20] = "eeeeeeeeeeeeeeeeee";
 
    OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT | OCI_ENV_THREADED | OCI_ENV_CONTEXT);
 
    cn = OCI_ConnectionCreate(MT("db"), MT("usr"), MT("pwd"), OCI_SESSION_DEFAULT);
    st  = OCI_StatementCreate(cn);
 
    OCI_Prepare(st, "update test set value = :str");
    OCI_BindString(st, ":str", str, 20);
    OCI_Execute(st);
    err = OCI_GetLastError();
 
    if (err)
    {
         err_handler(err);
    }
 
    OCI_Cleanup(); 
 
    return EXIT_SUCCESS;
}

output :
Code :
1
2
3
Error : ORA-12899: valeur trop grande pour la colonne "USR"."TEST"."VALUE" (rÚelle : 18, maximum : 10)
 
Error : ORA-12899: valeur trop grande pour la colonne "USR"."TEST"."VALUE" (rÚelle : 18, maximum : 10)
__________________
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 10/01/2013, 09h29   #5
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
Je viens de refaire un test en forçant le dépassement de capacité de la taille de la colonne pour une chaine de caractères mais toujours aucune remontée de l'erreur par le GetLastError alors qu'avec le handler je la récupère bien.
Je vais essayer de creuser un peu pour voir si il n'y a pas quelque chose que j'aurai mal fait
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 10h20   #6
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
quelle version de OCILIB et d'Oracle utilises tu ?
__________________
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 10/01/2013, 11h31   #7
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
Pour OCILIB c'est la toute dernière : 3.11.1
Pour ORACLE c'est : 11.2.0.2
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 20h11   #8
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
as tu essayé le code que j'ai posté ?
__________________
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 11/01/2013, 08h47   #9
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
J'essaye de tester ça ce matin et je te tiens au courant, merci de ton aide.

EDIT:
avec ton code ça fonctionne ...

EDIT2:
je pense avoir trouver mon soucis, après OCI_Execute je fais un OCI_GetSql pour pouvoir écrire dans mon log la requête, si j'enleve OCI_GetSql alors je récupère bien l'erreur avec OCI_GetLastError
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 22h53   #10
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
donc souci résolu
__________________
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 12/01/2013, 15h59   #11
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
Résolu oui mais j'aimerai bien récupérer ma requête pour l'afficher dans mon log, est ce que c'est normal que je ne puisse pas récupérer l'erreur après une OCI_GetSql ?
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2013, 16h15   #12
Vincent Rogier
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 366
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 35

Informations forums :
Inscription : juillet 2007
Messages : 2 366
Points : 4 881
Points : 4 881
OCI_GetLastError est comme la fonction windows GetLastError(), elle retourne une erreur si le dernier appel du caller thread a failé.

Le status erreur est reseté à chaque appel de l'api...

Pourquoi utiliser un handler global et un handler contextuel ?

Au pire je pourrai faire ne sorte que les fonctions OCI_ErrorXXXX() ne mettent pas à jour le flag d'erreur du caller threead... Je vais y reflechir pour la prochaine version de OCILIB....
__________________
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 12/01/2013, 16h44   #13
capic
Invité de passage
 
Inscription : décembre 2004
Messages : 20
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 20
Points : 2
Points : 2
Ok merci.
En fait j'utilise normalement que le GetLastError pour récupérer les erreurs, et comme aucune erreur n'était remontée avec les requêtes paramétrées alors que l’exécution renvoyait faux j'ai voulu tester avec un handler global et c'est là que je me suis aperçu du problème que j'avais.
En attendant une éventuelle modification dans les version ultérieures d'ocilib je vais changer mon code pour récupérer la requête après la gestion de l'erreur.
Encore merci pour ton aide
capic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h32.


 
 
 
 
Partenaires

Hébergement Web