Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 13 sur 13
  1. #1
    Invité de passage
    Inscrit en
    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

  2. #2
    Rédacteur/Modérateur
    Avatar de Vincent Rogier
    Profil pro vincent rogier
    Inscrit en
    juillet 2007
    Messages
    2 372
    Détails du profil
    Informations personnelles :
    Nom : vincent rogier
    Âge : 36

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 372
    Points : 5 199
    Points
    5 199

    Par défaut

    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

  3. #3
    Invité de passage
    Inscrit en
    décembre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 20
    Points : 2
    Points
    2

    Par défaut

    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.

  4. #4
    Rédacteur/Modérateur
    Avatar de Vincent Rogier
    Profil pro vincent rogier
    Inscrit en
    juillet 2007
    Messages
    2 372
    Détails du profil
    Informations personnelles :
    Nom : vincent rogier
    Âge : 36

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 372
    Points : 5 199
    Points
    5 199

    Par défaut

    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

  5. #5
    Invité de passage
    Inscrit en
    décembre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 20
    Points : 2
    Points
    2

    Par défaut

    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

  6. #6
    Rédacteur/Modérateur
    Avatar de Vincent Rogier
    Profil pro vincent rogier
    Inscrit en
    juillet 2007
    Messages
    2 372
    Détails du profil
    Informations personnelles :
    Nom : vincent rogier
    Âge : 36

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 372
    Points : 5 199
    Points
    5 199

    Par défaut

    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

  7. #7
    Invité de passage
    Inscrit en
    décembre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 20
    Points : 2
    Points
    2

    Par défaut

    Pour OCILIB c'est la toute dernière : 3.11.1
    Pour ORACLE c'est : 11.2.0.2

  8. #8
    Rédacteur/Modérateur
    Avatar de Vincent Rogier
    Profil pro vincent rogier
    Inscrit en
    juillet 2007
    Messages
    2 372
    Détails du profil
    Informations personnelles :
    Nom : vincent rogier
    Âge : 36

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 372
    Points : 5 199
    Points
    5 199

    Par défaut

    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

  9. #9
    Invité de passage
    Inscrit en
    décembre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 20
    Points : 2
    Points
    2

    Par défaut

    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

  10. #10
    Rédacteur/Modérateur
    Avatar de Vincent Rogier
    Profil pro vincent rogier
    Inscrit en
    juillet 2007
    Messages
    2 372
    Détails du profil
    Informations personnelles :
    Nom : vincent rogier
    Âge : 36

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 372
    Points : 5 199
    Points
    5 199

    Par défaut

    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

  11. #11
    Invité de passage
    Inscrit en
    décembre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 20
    Points : 2
    Points
    2

    Par défaut

    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 ?

  12. #12
    Rédacteur/Modérateur
    Avatar de Vincent Rogier
    Profil pro vincent rogier
    Inscrit en
    juillet 2007
    Messages
    2 372
    Détails du profil
    Informations personnelles :
    Nom : vincent rogier
    Âge : 36

    Informations forums :
    Inscription : juillet 2007
    Messages : 2 372
    Points : 5 199
    Points
    5 199

    Par défaut

    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

  13. #13
    Invité de passage
    Inscrit en
    décembre 2004
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : décembre 2004
    Messages : 20
    Points : 2
    Points
    2

    Par défaut

    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

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •