Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/12/2007, 19h50   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 0
Points : 0
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 :
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 :
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 :
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 :
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.
Coolbeats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2007, 22h02   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
à titre de premier test, je te suggèrer de terminer ta procédure par
Code :
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;
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2007, 10h43   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 2
Points : 0
Points : 0
J'ai inséré ton code Antoun et voilà ce que j'ai en retour :

Code :
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.
Coolbeats est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/12/2007, 17h17   #4
Membre éclairé
 
Inscription : février 2005
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2005
Messages : 349
Points : 358
Points : 358
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.

@+
overider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h58.


 
 
 
 
Partenaires

Hébergement Web