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 sur une procédure


Sujet :

SQL Procédural MySQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut problème sur une procédure


    J'utilise pour traduire mon site web un dictionnaire stocké actuellement sur une table dont voici la structure :
    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
     
    --
    -- Structure de la table `dico`
    --
    CREATE TABLE `dico` (
      `id` int(10) unsigned NOT NULL auto_increment,
      `IDPage` varchar(32) NOT NULL default '',
      `FR` text NOT NULL,
      `EN` text NOT NULL,
      `DE` text NOT NULL,
      `SP` text NOT NULL,
      `IT` text NOT NULL,
      PRIMARY KEY  (`id`),
      KEY `IDPage` (`IDPage`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;
    Le champs IDPage désigne la page web où se trouve le mot du dico. Sa présence dans la table dico pose un problème car il y a maintenant plus de 3000 mots dont beaucoup de doublons.
    Pour y remédier j'ai créé 2 nouvelles tables et une procédure pour les remplir correctement.
    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
     
    --
    -- Structure de la table `page`
    --
    CREATE TABLE `page` (
      `id_page` varchar(32) collate latin1_bin NOT NULL,
      `adresse` varchar(64) collate latin1_bin default NULL,
      `nom` varchar(32) collate latin1_bin default NULL,
      PRIMARY KEY  (`id_page`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    --
    -- Structure de la table `relation_dico_page`
    --
    CREATE TABLE `relation_dico_page` (
      `id_dico` int(10) NOT NULL,
      `id_page` varchar(32) collate latin1_bin NOT NULL,
      PRIMARY KEY  (`id_dico`,`id_page`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    Voici la procédure telle qu'elle est écrite dans MySQL Admin :
    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
     
    CREATE DEFINER=`root`@`localhost` PROCEDURE `insert_id_page`()
    BEGIN
            DECLARE done INT DEFAULT 0;
            DECLARE idpage VARCHAR(32);
            DECLARE iddico INT(10);
            DECLARE curseur CURSOR FOR SELECT `id`,`IDPage` FROM `dico` ;
            DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
            DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SET done = 0;
     
            OPEN curseur;
     
            REPEAT
                    FETCH curseur INTO iddico, idpage;
                    IF ! done THEN
                            INSERT INTO `page` (`id_page` ,`adresse` ,`nom`)
                            VALUES (idpage, '',idpage);
                            INSERT INTO `relation_dico_page` (`id_dico` ,`id_page`)
                            VALUES (`iddico`,`idpage`);
                    END IF;
            UNTIL done END REPEAT;
     
            CLOSE curseur;
    END
    Mon problème : la procédure n'affecte aucune ligne, les insertions ne marchent pas et il n'y a pas d'erreurs dans le log de mysql.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mysql> CALL insert_id_page;
    Query OK, 0 rows affected (0.09 sec)
    d'avance pour vos réponses

    P.S. C'est la première fois que je fait une procédure sous MySQL alors s'il vous plais ne soyez pas trop méchants si la solution est simple et évidente.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    à titre de premier test, je te suggèrer de terminer ta procédure par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    COMMIT ;
    SELECT 'page' as `table` COUNT(*) as NbInserts FROM page
    UNION ALL
    SELECT 'relation_dico_page', COUNT(*) FROM relation_dico_page;

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    J'ai inséré ton code Antoun et voilà ce que j'ai en retour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    mysql> CALL insert_id_page;
    +-------------------------+-----------+
    | table                   | NbInserts |
    +-------------------------+-----------+
    | dico_page               |         0 |
    | dico_relation_dico_page |         0 |
    +-------------------------+-----------+
    2 rows in set (0.08 sec)
     
    Query OK, 0 rows affected (0.09 sec)
    Rien ne se passe donc et je n'ai pas d'erreur dans le log.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 390
    Points : 465
    Points
    465
    Par défaut
    a ta place je remplace

    par

    je ne sais pas si la première formulation est efficace.

    De plus je testerai la valeur de done avant et/ou après ton IF afin de savoir si tu rentres dans ton fetch.

    @+

Discussions similaires

  1. [2008R2] Problème sur une procédure pivot + création de table
    Par libremax dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/10/2014, 22h21
  2. Problème sur une procédure
    Par Tonii dans le forum PL/SQL
    Réponses: 3
    Dernier message: 28/02/2012, 17h42
  3. Réponses: 3
    Dernier message: 06/09/2009, 19h22
  4. Problème sur une procédure stockée
    Par jolio2006 dans le forum PL/SQL
    Réponses: 6
    Dernier message: 17/11/2008, 19h55
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 16h33

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