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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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...

+ 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