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

Requêtes MySQL Discussion :

ALTER TABLE sur un champ de type SET dans une procédure


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut ALTER TABLE sur un champ de type SET dans une procédure
    Bonjour,
    je suis présentement à faire une procédure stocké pour modifier un champ de type SET dans un table quelconque. Je fais un ALTER TABLE manuellement et ca fonctionne à merveille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE `Test` CHANGE `champSet` `champSet`
    SET('0','1','2','3','4') NOT NULL

    Maintenant, ce que je veux faire, c'est de modifier le contenu du champSet pour qu'il contient que des valeurs qui font référence au contenu d'une autre table. En d'autres mots, j'ai une table définie comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `SERVICES` (
      `idService` tinyint(2) NOT NULL,
      `service` varchar(50),
      PRIMARY KEY(`idService`)
    )

    et qui contient les valeurs suivantes :

    0, 'service1'
    1, 'service2'
    2, 'service3'
    3, 'service4'

    Si j'ajoute un nouvel enregistrement dans la table SERVICES, je veux que la procédure modifie le contenu du champSet de la table Test pour que le nouvel élément puisse faire partie du SET. Voici la procédure que j'ai créé :

    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
    DROP PROCEDURE IF EXISTS addService $$
    CREATE PROCEDURE addService()
    BEGIN
      DECLARE done INT DEFAULT 0;
      DECLARE id VARCHAR(2);
      DECLARE strSet VARCHAR(50);
      DECLARE cur CURSOR FOR SELECT idService FROM services ORDER BY idService;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    
      OPEN cur;
      REPEAT
        FETCH cur INTO id;
        IF NOT done THEN
          SET strSet = CONCAT_WS(",", strSet,CONCAT("'",id,"'"));
        END IF;
      UNTIL done END REPEAT;
      CLOSE cur;
    
      SELECT message(strSet);
    
      ALTER TABLE `Test` CHANGE `champSet` `champSet` 
      SET(strSet) NOT NULL;
    
    END $$

    Le problème est que j'ai une erreur sur la ligne du ALTER TABLE, et j'arrive pas à comprendre pourquoi...

    Est-ce que quelqu'un peu m'aider là dessus ??

  2. #2
    Membre éprouvé
    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
    Points : 984
    Points
    984
    Par défaut
    Salut,

    Je ne pense pas que tu puisses exécuter une requête dynamique de cette façon. Sur certains SGBD, il y a EXECUTE IMMEDIATE qui aurait peut-être fait l'affaire mais pas sur MySQL.

    Essaie ceci :
    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
    DELIMITER $$
    
    DROP PROCEDURE IF EXISTS addService $$
    CREATE PROCEDURE addService()
    BEGIN
      DECLARE done INT DEFAULT 0;
      DECLARE id VARCHAR(2);
      DECLARE strSet VARCHAR(50);
      DECLARE cur CURSOR FOR SELECT idService FROM services ORDER BY idService;
      DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
    
      OPEN cur;
      REPEAT
        FETCH cur INTO id;
        IF NOT done THEN
          SET strSet = CONCAT_WS(",", strSet,CONCAT("'",id,"'"));
        END IF;
      UNTIL done END REPEAT;
      CLOSE cur;
    
      SELECT message(strSet);
    
      SET @requete = CONCAT('ALTER TABLE `Test` CHANGE `champSet` `champSet` SET(', strSet, ') NOT NULL');
      PREPARE requete_alter FROM @requete;
      EXECUTE requete_alter;
      DEALLOCATE PREPARE requete_alter;
    
    END $$
    
    DELIMITER ;

  3. #3
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Super, ca marche à merveille!

    Merci bien...

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

Discussions similaires

  1. filtrer ma table sur un champ de type date
    Par Abou Zar dans le forum Langage
    Réponses: 1
    Dernier message: 30/11/2010, 18h22
  2. Valeur d'un champ de type File dans une page HTML
    Par AlainTech dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 31/12/2007, 13h17
  3. Réponses: 5
    Dernier message: 10/05/2006, 15h47
  4. Réponses: 2
    Dernier message: 03/11/2005, 20h26
  5. Champs de type XML dans une base de données
    Par Flocodoupoil dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/07/2004, 18h57

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