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 :

problème pour separer une table avec une procedure


Sujet :

SQL Procédural MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut problème pour separer une table avec une procedure
    Bonjour,

    j'ai un problème avec le code qui suit, j'ai quelques connaissance en MySQL mais je ne suis pas un pro.

    je vous explique déjà ce a quoi j'aimerais arriver : j'ai une table avec environ 30000 lignes, j'aimerais créer une procédure générale pour la séparer en plusieurs tables selon 2 des champs de la table.

    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
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `genmess`.`Archiv_annee` $$
    CREATE PROCEDURE `genmess`.`Archiv_annee` (in id int, in an year)
     
     
    BEGIN
     
      DECLARE nom varchar(100) DEFAULT "SELECT uni_nom FROM tbl_univers WHERE uni_id=id";
      DECLARE archivan varchar(100) DEFAULT CONCAT('archivenv_', nom,'_',an);
     
     
      INSERT INTO archivan
      SELECT *
      FROM tbl_msgenv
      WHERE ((EXTRACT(YEAR FROM tbl_msgenv.env_date))=an And (tbl_msgenv.env_univers=id));
     
    END $$
     
    DELIMITER ;
    Ici, je ne suis pas du tout sur de mon code, j'ai déclaré une variable archivan qui sera le nom des tables triées, mais lorsque j'appelle la procédure:
    CALL Archiv_annee(3,2008);
    J'ai une erreur comme quoi archivan n'est pas une table existante, je comprend parfaitement cela mais je ne sait pas comment y remédier.

    Ensuite il doit aussi y avoir un probleme avec les dates car si je remplace archivan par une table vide précédemment créée, cela ne me retourne aucun resultat, alors que dans ma table d'origine il devrait retourner des valeur.

    Merci .

  2. #2
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Une variable ne peut pas être utilisée comme nom de table (ni de colonne d'ailleurs). Pour y arriver, il faut "assembler" la requête avec CONCAT, puis passer par PREPARE et EXECUTE.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    ok merci demain j'essaye sa

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    voila ce que j'ai fait :
    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
     
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `genmess`.`Archiv_annee` $$
    CREATE PROCEDURE `genmess`.`Archiv_annee` (in id int, in an year)
     
     
    BEGIN
     
      DECLARE nom varchar(255) DEFAULT "SELECT uni_nom FROM tbl_univers WHERE uni_id=id";
     
      SET @n = 'nom';
      SET @a = 'an';
     
      SET @c = CONCAT('archivenv_', @n,'_',@a);
     
      SET @proc = CONCAT('INSERT INTO ', @c,'SELECT * FROM tbl_msgenv
                          WHERE ((EXTRACT(YEAR FROM tbl_msgenv.env_date))=an And (tbl_msgenv.env_univers=id));"');
     
     
      PREPARE fct FROM @proc;
      EXECUTE fct;
     
    END $$
    Sa a l'air de marcher, mais maintenant le soucis est que les champs de mes différentes tables n'ont pas les mêmes noms, je ne peut donc pas faire un 'SELECT *', il faudrait que je fasse avec des AS, les nom des champs sont de la forme :
    -env_id (table initiale) et vul_id, ros_id, dmd_id
    -env_nom et vul_nom, ros_nom, dmd_nom
    - etc ...
    le nom des champs du tableau de destination dépend de l'id saisi.

    et je ne suis pas sur que cela soit faisable.

    Bon j'ai eu un peu de temps dans la journée pour y regarder, voila ou j'en suis arrivé :

    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
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `genmess`.`Archiv_annee` $$
    CREATE PROCEDURE `genmess`.`Archiv_annee` (in id int, in an year)
     
     
    BEGIN
     
      DECLARE nom varchar(255) DEFAULT "SELECT uni_nom FROM tbl_univers WHERE uni_id=id";
     
      SET @i = IF(id=3,"vul",IF(id=4,"ros",IF(id=5,"dmd","dem")));
     
      SET @n = nom;
      SET @a = an;
     
      SET @c = CONCAT('archivenv_', @n,'_',@a);
     
      SET @proc = CONCAT('INSERT INTO ', @c,' SELECT env_id AS ', @i,'_id, env_univers AS ', @i,'_univers, env_idaction AS ',
                          @i,'_idaction, env_modele AS ',@i,'_modele, env_date AS ',@i,'_date, env_codemanaginn AS ',
                          @i,'_codemanaginn, env_valeur AS ',@i,'_valeur, env_msg AS ',@i,'_msg, env_from AS ',
                          @i,'_from, env_cout AS ',@i,'_cout, env_periode AS ',@i,'_periode, env_id_expediteur AS ',
                          @i,'_id_expediteur, env_pro_id AS ',@i,'_pro_id, env_typmedia AS ',@i,'_typmedia, env_pj1 AS ',
                          @i,'_pj1, env_pj2 AS ',@i,'_pj2, env_pj3 AS ',@i,'_pj3, env_mailto AS ',@i,'_mailto, env_mailcc AS ',
                          @i,'_mailcc, env_mailbcc AS ',@i,'_mailbcc, env_subject AS ',@i,'_subject, env_fichcsv AS ',
                          @i,'_fichcsv FROM tbl_msgenv
                          WHERE ((EXTRACT(YEAR FROM tbl_msgenv.env_date))=an And (tbl_msgenv.env_univers=id));');
     
     
      PREPARE fct FROM @proc;
      EXECUTE fct;
     
    END $$
     
    DELIMITER ;
    Mais maintenant le problème vient de ma variable nom qui ne prend pas le résultat de la requête sql, encore une fois je comprend pourquoi mais je ne sait pas comment y remédier.


    Merci de votre aide .

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    j'ai trouvé la solution par moi-même, pour ceux que sa intéresse voici le code :

    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
    DELIMITER $$
     
    DROP PROCEDURE IF EXISTS `genmess`.`Archiv_annee` $$
    CREATE PROCEDURE `genmess`.`Archiv_annee` (in nom varchar(15), in an year)
     
     
    BEGIN
     
     
      SET @i = IF(nom="vulco","vul",IF(nom="rossignol","ros",IF(nom="dunlop","dmd",IF(nom="demo","dem",null))));
      SET @p = IF(nom="vulco",3,IF(nom="rossignol",5,IF(nom="dunlop",6,IF(nom="demo",4,null))));
     
      SET @n = nom;
      SET @a = an;
     
      SET @c = CONCAT('archivenv_', @n,'_',@a);
     
      SET @proc1 = CONCAT('INSERT INTO ', @c,' SELECT env_id AS ', @i,'_id, env_univers AS ', @i,'_univers, env_idaction AS ',
                          @i,'_idaction, env_modele AS ',@i,'_modele, env_date AS ',@i,'_date, env_codemanaginn AS ',
                          @i,'_codemanaginn, env_valeur AS ',@i,'_valeur, env_msg AS ',@i,'_msg, env_from AS ',
                          @i,'_from, env_cout AS ',@i,'_cout, env_periode AS ',@i,'_periode, env_id_expediteur AS ',
                          @i,'_id_expediteur, env_pro_id AS ',@i,'_pro_id, env_typmedia AS ',@i,'_typmedia, env_pj1 AS ',
                          @i,'_pj1, env_pj2 AS ',@i,'_pj2, env_pj3 AS ',@i,'_pj3, env_mailto AS ',@i,'_mailto, env_mailcc AS ',
                          @i,'_mailcc, env_mailbcc AS ',@i,'_mailbcc, env_subject AS ',@i,'_subject, env_fichcsv AS ',
                          @i,'_fichcsv FROM tbl_msgenv
                          WHERE ((EXTRACT(YEAR FROM tbl_msgenv.env_date))=',@a,' And (tbl_msgenv.env_univers=',@p,'));');
     
     
      PREPARE fct FROM @proc1;
      EXECUTE fct;
     
     
      SET @proc2 = CONCAT('DELETE FROM tbl_msgenv
                    WHERE ((EXTRACT(YEAR FROM tbl_msgenv.env_date))=',@a,' And (tbl_msgenv.env_univers=',@p,'));');
     
      PREPARE p2 FROM @proc2;
      EXECUTE p2;
    END $$
     
    DELIMITER ;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/01/2015, 16h10
  2. copier une table d'une BDD dans une table d'une autre BDD
    Par faniette dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/05/2013, 10h17
  3. [MySQL] requete dans une table avec une varible d'une autre table
    Par kogoi dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 03/11/2011, 15h24
  4. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50
  5. Réponses: 6
    Dernier message: 30/08/2007, 16h47

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