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] Procédure stockée


Sujet :

Interfaces de programmation Oracle

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 44
    Par défaut [OCILIB] Procédure stockée
    Bonjour,

    Je voudrais exécuter une procédure stockée avec ocilib, le problème est que je dois passer des paramètres IN/OUT dans la procédure.

    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    OCI_Connection * cn;
    OCI_Statement *st;
    cn = OCI_ConnectionCreate("xx", "yy", "zz", OCI_SESSION_DEFAULT);
    st = OCI_StatementCreate(cn);
    OCI_Prepare(st, "BEGIN Package.Procedure(:param1, :param2, 1, 'toto'); END;");
    OCI_BindInt(st, ":param1", &param1);
    OCI_BindString(st, ":param2", param2, 15);
    OCI_Execute(st);
    OCI_Commit(cn);
    ...
    Cette procédure permet d'insérer une ligne de donnée dans une table de la base Oracle. Je n'ai aucun problème à la compilation, mais lorsque je l'exécute, l'exécution ne s'arrête pas...

    J'ai essayé également de remplacer la fonction OCI_BindXxx() par OCI_RegisterXxx(), mais aucun changement...

    Auriez-vous une réponse à ce problème?

    Merci

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

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

    Le code paraît ok à première vue...

    peux poster la déclaration de la procédure ainsi que la déclaration des variables et leur valeurs affectée ?

    As tu passé un error handler à OCI_Initialize() ?
    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
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 44
    Par défaut
    Bonjour,

    voici la déclaration de la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    PROCEDURE Procedure (
    param1    IN OUT  TOTO.X%TYPE,
    param2    IN OUT  NUMBER,
    param3                TOTO.Z%TYPE,
    param4                TOTO.T%TYPE
    ) AS 
    BEGIN
    ...
    END Procedure;
    au niveau de l'affectation, justement étant donné que c'est un IN OUT, on ne lui attribut pas de valeur dans SQL...


    voici le code dans SQL et qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DECLARE
    param1 NUMBER;
    param2 VARCHAR2(10);
    BEGIN 
      Package.Procedure(param1, param2, 1, 'toto');
    END;
    Sinon j'ai effectivement passé un error handler en paramètre, mais comme le programme ne s'arrête pas(blocage au niveau de l'OCI_Execute(st)), je n'obtiens pas de message...

    ps: Peux-tu m'expliquer l'utilité de la fonction OCI_RegisterXXX ?

    Merci

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 44
    Par défaut
    Bonjour,

    J'ai parcouru brievement la librairie OCCI, et ce que je voudrais faire ressemblerai un peu à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    stmt->setSQL("begin P_TESTFBO(:1, :2); end;");
    		
    stmt->setNumber(1, id);//1 - IN - Id
    stmt->registerOutParam(2, OCCIDOUBLE); //2 - OUT - amount
    
    stmt->execute(); //execute procedure
    
    price = stmt->getDouble(2);
    Est-ce qu'il existe une fonction dans ocilib qui ressemblerai à la fonction registerOutParam() ?

    Merci

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Les fonctions de binding de OCILIB (OCI_Bindxxx()) gèrent à la fois les paramètres in et out.

    Je te rappelle qu'il faut toujours qu'une chaine de caractères bindée à un paramètre IN ou IN/OUT doit avoir un zéro terminal et donc être initialisée

    voici un exemple qui fonctionne :

    Code de la procédure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE OR REPLACE PROCEDURE TEST_PROC
    (
      param1    IN OUT  NUMBER,
      param2    IN OUT  VARCHAR,
      param3            NUMBER,
      param4            VARCHAR
    ) AS 
    BEGIN
     
      param1 := 123456;
      param2 := '1234567';
     
    END;
    Code OCILIB :
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    int main(void)
    {
        OCI_Connection *cn;
        OCI_Statement  *st;
     
        int  param1;
        char param2[21];
     
        OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT);
     
        cn = OCI_ConnectionCreate("db", "usr", "pwd", OCI_SESSION_DEFAULT);
        st = OCI_StatementCreate(cn);
     
        OCI_Prepare(st, "BEGIN test_proc(:param1, :param2, 1, 'toto'); END;");
        OCI_BindInt(st, ":param1", &param1);
        OCI_BindString(st, ":param2", param2, 20);
     
        param1 = 0;
        param2[0] = 0;
     
        OCI_Execute(st);
        OCI_Commit(cn);
     
        printf("param1 = %i\n", param1);
        printf("param2 = %s\n", param2);
     
        OCI_Cleanup();
     
        return EXIT_SUCCESS;
    }
    Output :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    param1 = 123456
    param2 = 1234567
    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

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 44
    Par défaut
    Bonjour,

    J'ai fait exactement la même manipulation que vous, voici mon programme C++ :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    int main(void)
    {
        OCI_Connection *cn;
        OCI_Statement  *st;
     
        int  param1;
    
     
        OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT);
       
        cn = OCI_ConnectionCreate("db", "usr", "pwd", OCI_SESSION_DEFAULT);
        st = OCI_StatementCreate(cn);
     
        OCI_Prepare(st, "BEGIN PA_Package.test_proc(:param1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 'toto'); END;");
        OCI_BindInt(st, ":param1", &param1);
    
     
        param1 = 0;
    
        cout << "avant" << endl;
        OCI_Execute(st);
        cout << "après" << endl;
        OCI_Commit(cn);
     
        printf("param1 = %i\n", param1);
    
     
        OCI_Cleanup();
     
        RETURN EXIT_SUCCESS;
    }


    Output :

    et le programme ne s'arrete pas...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 44
    Par défaut
    Bonjour,

    j'ai essayé d'effectuer un update dans ma base de donné:

    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
    19
    20
    21
    22
    23
    24
    25
    26
     
    int main(void)
    {
        OCI_Connection *cn;
        OCI_Statement  *st;
     
        int  param1;
        char param2[21];
     
        OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT);
     
        cn = OCI_ConnectionCreate("db", "usr", "pwd", OCI_SESSION_DEFAULT);
        st = OCI_StatementCreate(cn);
     
        OCI_Prepare(st, "UPDATE TAB SET CHAMPS=10000 WHERE  CHAMPS1=20");
     
     
        OCI_Execute(st);
        OCI_Commit(cn);
     
        OCI_Cleanup();
     
        RETURN EXIT_SUCCESS;
    }
     
    le programme se termine mais le update n'est pas effectué dans la base de données Oracle.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 44
    Par défaut
    Bonjour,

    En faite j'avais TOAD qui était ouvert lors de l'exécution de mon programme...
    Et comme je fais un accès Oracle avec le même login, il considère que c'est une autre session... du coup ça ne marche pas

    Solution : FERMER TOAD ...

    Merci

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Procédure stocké:Insert et renvoie de la clé primair
    Par caramel dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/04/2003, 09h34
  3. [Pervasive SQL ] procédure stockée
    Par magellan dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 25/10/2002, 13h17
  4. Explication procédure stockée
    Par underworld dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/09/2002, 10h51
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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