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

SQL Procédural MySQL Discussion :

MySQL V5 : Appeler une Proc Stock à l'intérieur d'une autre Proc Stock


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Inscrit en
    Mai 2003
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 71
    Points : 52
    Points
    52
    Par défaut MySQL V5 : Appeler une Proc Stock à l'intérieur d'une autre Proc Stock
    Bonjour à tous,

    J'ai une procédure stockée qui est chargée de créer un enregistrement dans ma base (disons, un client). Elle me renvoie un resultset avecdeux champs : un code (integer) et un libellé (varchar).
    On va dire que la proc stock s'appelle "CreerClient()"

    Le code est 0 si la création s'est bien passé, 1 ou 2 s'il y a eu une erreur.
    Si le code est 0, le libellé contient l'id de la ligne crée.
    Si le code est 1 ou 2, le libellé contient un texte décrivant le problème.

    Je voudrais appeler cette procédure stockée à l'intérieur d'une autre procédure stockée, et récupérer le code et le libellé.

    Un peu à la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE PROCEDURE `nom_base`.`CreerDeuxClients`()
    BEGIN
    -- (declaration des variables)
    -- ... 
     
    call CreerClient(...) INTO code, libelle;
     
    END;
    Mais, évidemment, ce code là ne compile pas.

    Et pour faire quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select CreerClient(...) INTO code, libelle;
    Il semblerait qu'il faille que "CreerClient" soit une fonction et non une procédure.

    Comment faire pour appeler correctement ma première Proc Stock dans ma seconde, et récupérer le code et le libellé ?

    Merci d'avance,

    Cdlt,

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 13
    Points : 15
    Points
    15
    Par défaut
    Coucou,
    j ai eu le meme probleme et j ai trouve cette solution, je la partage donc


    Execute a stored procedure or function
    [ { EXEC | EXECUTE } ]
    {
    [ @return_status = ]
    { module_name [ ;number ] | @module_name_var }
    [ [ @parameter = ] { value
    | @variable [ OUTPUT ]
    | [ DEFAULT ]
    }
    ]
    [ ,...n ]
    [ WITH RECOMPILE ]
    }
    [;]

  3. #3
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    les procédures stockées sont des procédures, donc par définition elles ne retournent pas de valeurs. Par contre les variables peuvent y être passées par référence.

    Donc si votre procédure imbriquée avait un argument au départ (disons arg1), vous deviez l'avoir ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     CREATE PROCEDURE CreerClient(in arg1)
    Désormais notez là ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     CREATE PROCEDURE CreerClient(in varchar(32) arg1, out int code, out varchar(32) lib)
    BEGIN
     ...
     SET CODE = 3;
     SET LIB = 'Client créé';
    END
    Dans votre code de la procédure stockée faites ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE PROCEDURE TOTO()
    BEGIN
      DECLARE CODE AS INT;
      DECLARE MESSAGE AS VARCHAR(32);
      CALL CreerClient('client toto',CODE ,MESSAGE);
      -- Ici code et message sont valuées par la procédure stockée
    END
    Cela fait un moment que je n'utilise plus MySQL. Mais MySQL respecte assez bien la norme la dessus (contrairement à ce satané oracle) et je ne suis plus sur de l'ordre de déclarations des paramètres. Je crois que c'est :
    1-> in|out|inout
    2-> le type de données
    3-> le nom de la variable
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 04/05/2021, 13h23
  2. Procédures stockées à l'intérieur d'une transaction
    Par SergioMaster dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2014, 07h17
  3. Réponses: 2
    Dernier message: 21/02/2013, 19h54
  4. Réponses: 7
    Dernier message: 06/11/2006, 16h18
  5. Réponses: 2
    Dernier message: 10/12/2004, 15h43

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