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 :

Procédure stockée, passage de paramètres


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut Procédure stockée, passage de paramètres
    Bonjour à tous, je me permet de vous poser une question suite à un pbme que je ne parviens à résoudre.

    Voici l'exemple sur lequel je travaille.
    CREATE PROCEDURE ligue1.INIT_EQUIPE (nom_eq varchar(50), ville_eq varchar(30))
    BEGIN
    INSERT INTO equipe (nom, ville) VALUES (nom_eq, ville_eq);
    END//
    Cela marche parfaitement. Le pbme, c'est que je souhaite passer la table "equipe" en parametre, notamment pour réutiliser cette procédure sur différentes tables, de cette facon :

    CREATE PROCEDURE ligue1.INIT_EQUIPE (equipe_var varchar(50), nom_eq varchar(50), ville_eq varchar(30))
    BEGIN
    INSERT INTO equipe_var (nom, ville) VALUES (nom_eq, ville_eq);
    END//
    mais lors de l'execution, MYSQL5 prend equipe_var directement, il ne l'interprête pas comme la variable de parametre qu'il doit remplacer (je ne sais pas si je me suis bien fait comprendre)
    du coup il me dit que la table equipe_var n'existe pas, ce qui est fort logique.

    N'ayant pas trouvé d'exemples me permettant de mettre en place cela, je m'en remet à vous afin de m'aiguiller.

    En vous remerciant par avance.
    Loïc.

  2. #2
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Salut,

    Il faut utiliser du SQL dynamique. C'est-à-dire créer la requête sous forme de chaîne de caractères, avant de l'exécuter.

    Un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE PROCEDURE ligue1.INIT_EQUIPE (equipe_var varchar(50), nom_eq varchar(50), ville_eq varchar(30))
    BEGIN
    SET @requete = CONCAT('INSERT INTO ', equipe_var, '(nom, ville) VALUES (nom_eq, ville_eq)');
    PREPARE requete_insert FROM @requete;
    EXECUTE requete_insert;
    DEALLOCATE PREPARE requete_insert;
    END //

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut
    okay ca a l'air de marcher, je te remercie bcp !!!

    je vais l'adapter ds le vrai code now ^^

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut
    hum je vais passer pour un boulet... mais ca ne marche pas avec le vrai code... le truc c'est que je dois faire executer la requete dans un curseur, comme suit :

    Je suis dsl de redemander de l'aide, à la base je suis administrateur système, et cela fait depuis l'IUT que je n'ai pas fait de procédure stockée
    du coup je plane ^^" (en + le code est pas de moi...)

    CREATE PROCEDURE MAJ_copier_identifiant1(IN inVar VARCHAR(25))
    BEGIN
    DECLARE nom_id VARCHAR(128);
    DECLARE max_id VARCHAR(128);
    DECLARE max_id_obj VARCHAR(128);
    DECLARE done INT DEFAULT 0;
    SET @requete = CONCAT('SELECT champ3 FROM ',inVar,' WHERE champ3 NOT IN (SELECT Identifiant_beaune FROM import_tc_hotels.ass_idcdt_idbeaune)');
    DECLARE cura CURSOR FOR @requete;

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    SELECT "toto" as inVar;
    UPDATE import_tc_hotels.inVar SET `champ3` = champ1;
    OPEN cura;
    REPEAT
    FETCH cura INTO nom_id;
    IF NOT done THEN
    SELECT concat('HOTBOU02',right(max(id),8)+1) INTO max_id FROM bdr_cdt_data.hot;
    INSERT INTO bdr_cdt_data.hot (id) VALUES(max_id);
    INSERT INTO import_tc_hotels.ass_idcdt_idbeaune (Identifiant_cdt,Identifiant_beaune) VALUES (max_id, nom_id);
    SELECT concat('obj',right(max(id),5)+1) INTO max_id_obj FROM bdr_cdt_data.obj;
    INSERT INTO bdr_cdt_data.obj (id) VALUES(max_id_obj);
    INSERT INTO bdr_cdt_data.ass_idobj_idssobj (idObj,idssObj) VALUES (max_id_obj,max_id);
    END IF;
    UNTIL done END REPEAT;
    CLOSE cura;
    UPDATE ass_idcdt_idbeaune INNER JOIN import_tc_hotels.inVar ON ass_idcdt_idbeaune.Identifiant_beaune = import_tc_hotels.inVar.champ3 SET import_tc_hotels.inVar.champ1 = Identifiant_cdt;
    END
    |

  5. #5
    Membre émérite
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Par défaut
    Malheureusement, il me semble que MySQL ne permette pas d'utiliser un curseur avec une requête dynamique. Je me trompe peut-être...

    Si tu ne trouves pas de solution. Voici une bidouille qui me vient à l'esprit : avec un prepared statement, tu crées une table temporaire que tu remplis (INSERT ... SELECT) avec les enregistrements que tu as besoin pour ton curseur. Et ton curseur sera défini pour parcourir cette table temporaire.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 24
    Par défaut
    hum oki, je commencais a m'en douter pour le coup des curseurs...

    Beh je vais tenter de me débrouiller, je te remercie bcp pour le temps que tu m'as accordé, c'était très sympa de ta part.

    @++

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

Discussions similaires

  1. appel d'une procédure stocké a 2 paramétre
    Par alex61 dans le forum ASP.NET
    Réponses: 8
    Dernier message: 21/06/2010, 09h41
  2. Réponses: 2
    Dernier message: 20/09/2006, 14h38
  3. Procédure stockée : passage d'un tableau en paramètres
    Par thomas_strass dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/05/2006, 14h52
  4. Procédure stockée avec deux paramètres ADO/ORACLE
    Par zanifu dans le forum Bases de données
    Réponses: 7
    Dernier message: 01/03/2006, 09h13
  5. Réponses: 2
    Dernier message: 15/09/2004, 18h17

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