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

PostgreSQL Discussion :

Multiples appels de procédures - Paramètres OUT


Sujet :

PostgreSQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Points : 16
    Points
    16
    Par défaut Multiples appels de procédures - Paramètres OUT
    Bonjour,

    je travaille actuellement sur une migration de base de données Oracle vers Postgresql.

    Je possède un problème sur les paramètres OUT des procédures, lors de multiples appels.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure1 (OUT param1, OUT param2)
    La procedure1 appelle la procédure procedure2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    procedure2 (OUT param1bis, OUT param2bis)
    Les paramètres param1 et param2 vont prendre les valeurs respectives param1bis et param2bis après l'appel de procedure2 depuis procedure1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE PROCEDURE  procedure1 (OUT param1, OUT param2)
      RETURNS record AS
    $BODY$
    DECLARE
          uneVariableQuOnUtilisePas text;
     
    BEGIN
     
          select param1bis, param2bis INTO param1, param2 FROM procedure2();
     
    END;    
    $BODY$
      LANGUAGE plpgsql VOLATILE
    C'est ici que le problème se pose

    param1 ne change pas de valeur après l'appel, pourtant l'affectation vers param1bis est bien effectuée (cf. code ci-dessus).
    Même problème pour param2

    Quelle démarche faut-il adopter pour résoudre ce problème ?

    Merci.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2011
    Messages : 37
    Points : 38
    Points
    38
    Par défaut
    As-tu essayé la syntaxe suivante :

    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
     
    CREATE PROCEDURE  procedure1 (OUT param1, OUT param2)
      RETURNS record AS
    $BODY$
    DECLARE
          uneVariableQuOnUtilisePas text;
     
    BEGIN
     
          SELECT param1bis, param2bis INTO param1, param2 FROM procedure2();
    SELECT INTO param1, param2 * FROM procedure2();
     
    END;    
    $BODY$
      LANGUAGE plpgsql VOLATILE

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    Votre code ne compile pas sous postgresql.

    La déclaration d'une variable n'est pas utile si vous ne l'utilisez pas, vous pouvez enlever le bloc "declare".


    cette discussion est presque identique a celle que vous avez déjà ouverte.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create table dual (para1 varchar(10), para2(10));
    insert into dual values ('x', 'y');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE or replace FUNCTION  procedure1 (OUT para1 varchar, OUT para2 varchar)
      RETURNS record AS
    $BODY$ 
    BEGIN 
          SELECT par1, par2 INTO para1, para2 FROM dual; 
    END;    
    $BODY$
       LANGUAGE plpgsql VOLATILE;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE or replace FUNCTION  procedure2 (OUT param1 varchar, OUT param2 varchar)
      RETURNS record AS
    $BODY$ 
    BEGIN 
          SELECT para1, para2 INTO param1, param2 FROM procedure1(); 
    END;    
    $BODY$
       LANGUAGE plpgsql VOLATILE;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from procedure2();
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    param1        param2
    ----------------------------
    x                      y

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2011
    Messages : 11
    Points : 16
    Points
    16
    Par défaut
    Merci Skaribou, j'ai testé cette syntaxe.

    Ta solution fonctionne !


    Je passe le problème à résolu alors.




    En revanche, DUAL n'est pas une table sur Postgresql, il faut créer une view DUAL. La table DUAL est pour Oracle.
    Quelques infos intéressantes : docs

  5. #5
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Citation Envoyé par vingohan Voir le message
    En revanche, DUAL n'est pas une table sur Postgresql, il faut créer une view DUAL. La table DUAL est pour Oracle.
    Quelques infos intéressantes : docs
    C'est pour ca qu'il y a un create table.

    Des exemples sont là pour être compris et réinterprété, et non pas copier / coller sans réfléchir.


    Bref, la solution que vous retenez est identique au niveau résultat que l'essai que vous faisiez dans votre 1er poste.


    Du coup on peut extrapoler que le problème ne venait pas de là ou qu'il a été mal exposé.

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

Discussions similaires

  1. [PDO] Procédures stockées, paramètres OUT et multiples resultset
    Par Gusso dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 27/05/2010, 08h35
  2. Question sur la déclaration d'un paramètre lors de l'appel du procédure stockée
    Par th.garcia dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 26/06/2009, 13h58
  3. Automation : appel de procédure paramétrée
    Par Laestic dans le forum VBA Word
    Réponses: 3
    Dernier message: 18/11/2007, 18h46
  4. Réponses: 1
    Dernier message: 14/08/2007, 11h14
  5. Réponses: 1
    Dernier message: 01/06/2006, 11h31

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