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.