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 :

pb parametre dans procedure stockée


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Par défaut pb parametre dans procedure stockée
    Bonjour,

    Je voudrais donner un nom de table en param à ma procedure stockée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `maProcedure`$$
     
    CREATE DEFINER=`root`@`192.168.%` PROCEDURE `maProcedure`(IN nomTable varchar(100))
    BEGIN 
    SELECT * from nomTable ;
    END$$
     
    DELIMITER ;
    je l'appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     call maProcedure('tableRecherche');
    et là il me dit que nomTable doesn't exist, en fait il prend le parametre comme nom de table et non pas comme une variable.

    je me suis trompée quelque part mais où ?
    Merci d'avance

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Il faut utiliser du SQL dynamique dans la procédure car les noms de table ne peuvent pas être des variables en SQL statique :

    A la place de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        SELECT * FROM nomTable ;
    Essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        SET @requete = CONCAT('SELECT * FROM ', nomTable);
     
        PREPARE stmt1 FROM @requete; 
        EXECUTE stmt1; 
        DEALLOCATE PREPARE stmt1;
    PS : Evitez de créer des procédures avec root, c'est une très mauvaise habitude

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Par défaut
    ok merci,

    pour contre, comment faire, car en fait, ma procédure est plus complexe que ça.
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `recherche_majUnicite`$$
     
    CREATE PROCEDURE `recherche_majUnicite`(IN nomTable VARCHAR(100))
     
    BEGIN
     
     DECLARE done INT DEFAULT 0;
     
     DECLARE refLivre_,oldrefLivre,numEditionLivre_,numCollection_,oldnumCollection ,referenceUniqueParLivre INT;
     
     DECLARE cur_1 CURSOR FOR SELECT refLivre,numCollection,numEditionLivre from nomTable order by refLivre,numCollection;
     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
     # init vars
      set referenceUniqueParLivre = 1;
     
      DROP TABLE IF EXISTS refUniqueParLivre;
      CREATE TABLE refUniqueParLivre( 
    	numEditionLivre INT NOT NULL
    	)  ENGINE=MEMORY ;
     
      OPEN cur_1;
      REPEAT
     
        FETCH cur_1 INTO refLivre_,numCollection_,numEditionLivre_;
        if not done then
     
          # changement de ref livre
          if  oldrefLivre != refLivre_ then
            set referenceUniqueParLivre = 1;
          else
    	set referenceUniqueParLivre = 0;
          end if;
          if referenceUniqueParLivre = 1 then
    	INSERT INTO refUniqueParLivre VALUES( numEditionLivre_);
          end if;
          # gestion des changements
          set oldrefLivre = refLivre_;
        end if;
      UNTIL done = 1 END REPEAT;
      CLOSE cur_1;
     
      CREATE INDEX numEditionLivre ON refUniqueParLivre(numEditionLivre);
      UPDATE nomTable,refUniqueParLivre 
        SET nomTable.referenceUnique=1
        WHERE nomTable.numEditionLivre=refUniqueParLivre.numEditionLivre;
      DROP TABLE refUniqueParLivre; 
    END$$
     
    DELIMITER ;
    je ne comprends pas tout, je n'ai jamais fait de proc, je retravaille sur une déjà existante, pour le root, c'était déjà comme ça donc je laisse

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Apparemment de ce que je vois dans la doc, on ne peut pas ouvrir un curseur sur une requête dynamique. Il vous faut donc trouver une autre solution, sans nom de table en paramètre .

    A vue de nez cette procédure me semble bien compliquée, on pourrait peut-être la simplifier et résoudre votre problème par la même occasion. Que doit-elle faire exactement ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    490
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 490
    Par défaut
    hello,

    en fait, je n'en sais trop rien... . On m'a demander de mettre un nom de table en parametre. donc je n'ai juste modifiée en ajoutant un nom de table en parametre...

    Merci en tout cas

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Par défaut
    Citation Envoyé par maysa Voir le message
    en fait, je n'en sais trop rien... .
    C'est peut-être une bonne question à se poser avant d'aller plus loin, non ?

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

Discussions similaires

  1. [Débutant] Parametre de sortie dans procedure stockée
    Par mayekeul dans le forum C#
    Réponses: 12
    Dernier message: 17/02/2012, 13h27
  2. Réponses: 6
    Dernier message: 09/10/2006, 11h58
  3. Appeler Requete avec parametre dans Procedure
    Par shadockgreg dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 08/09/2006, 12h25
  4. Réponses: 3
    Dernier message: 19/04/2006, 18h44
  5. [VB] Passer plusieurs parametres à une procedure stockée
    Par wolflinger dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 19/04/2005, 14h13

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