problème d'affichage des messages
Bonjour, voici le code:CREATE DEFINER=root
@localhost
PROCEDURE segmentation_statut
()
BEGIN
declare age int(10);
declare p_age varchar(100);
declare moy_age int(10);
declare nb_homme int(10);
declare nb_femme int(10);
declare nb_particip int(10);
declare prc_homme float;
declare prc_femme float;
DECLARE finished INTEGER DEFAULT 0;
DECLARE curs_age
CURSOR FOR SELECT question2
FROM questionnaire;
DECLARE CONTINUE HANDLER
FOR NOT FOUND SET finished = 1;
select COUNT() INTO nb_particip from questionnaire;
select COUNT() INTO nb_homme from questionnaire where question1='Homme';
select COUNT() INTO nb_femme from questionnaire where question1='Femme';
set prc_homme:= (nb_homme/nb_particip)100;
set prc_femme:= (nb_femme/nb_particip)*100;
select concat('La sélection par critéres de statut"sexe"a montré que le pourcentage des hommes participants à ce sondage est',prc_homme,'%,tandis que celui de la femme est',prc_femme,'%');
set age:=0;
open curs_age;
while finished != 1 do
FETCH curs_age INTO p_age;
case p_age
when p_age='moins de 18ans' then set age:=age+9;
when p_age='18-35' then set age:=age+27;
when p_age='35-60' then set age:=age+47;
when p_age='plus de 60ans' then set age:=age+60;
end case;
end while;
close curs_age;
set moy_age:=age/nb_particip;
select concat('La moyenne d age de la population participant aux services et aux jeux SMS est',moy_age);
END
le dernier message ne s'affiche pas!!je ne suis pas arriver à détecter le problème et ça se répéte dans plusieurs procédures surtout lorsque j'utilise une structure conditionnelle..pourriez_vous m'aider?
Réponses apportées à cette discussion
Salut. il y a effectivement des erreurs dans le code de la procédure.
Un SELECT COUNT() n'est pas bon : on fait à la rigueur SELECT COUNT(*) ou bien on compte une colonne en particulier;
Ensuite il y en a une un peu plus loin où il manque un opérateur lors de la définition de la variable prc_homme.
Petit conseil pratique, il faut écrire en utilisant une indentation et en aérant un peu le code pour en faciliter la lecture. Le Résultat corrigé doit ressembler à ceci :
CREATE DEFINER = root@localhost PROCEDURE segmentation_statut ()
BEGIN
DECLARE age int(10);
DECLARE p_age varchar(100);
DECLARE moy_age int(10);
DECLARE nb_homme int(10);
DECLARE nb_femme int(10);
DECLARE nb_particip int(10);
DECLARE prc_homme float;
DECLARE prc_femme float;
DECLARE finished integer DEFAULT 0;
DECLARE curs_age CURSOR FOR
SELECT question2 FROM questionnaire;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = 1;
SELECT COUNT(*) INTO nb_particip FROM questionnaire;
SELECT COUNT(*) INTO nb_homme FROM questionnaire WHERE question1 = 'Homme';
SELECT COUNT(*) INTO nb_femme FROM questionnaire WHERE question1 = 'Femme';
SET prc_homme := (nb_homme / nb_particip) * 100;
SET prc_femme := (nb_femme / nb_particip) * 100;
SELECT CONCAT('La sélection par critéres de statut"sexe"a montré que le pourcentage des hommes participants à ce sondage est', prc_homme, '%,tandis que celui de la femme est', prc_femme, '%');
SET age := 0;
OPEN curs_age;
WHILE finished != 1 DO
FETCH curs_age INTO p_age;
CASE p_age
WHEN p_age = 'moins de 18ans' THEN SET age := age + 9;
WHEN p_age = '18-35' THEN SET age := age + 27;
WHEN p_age = '35-60' THEN SET age := age + 47;
WHEN p_age = 'plus de 60ans' THEN SET age := age + 60;
END CASE;
END WHILE;
CLOSE curs_age;
SET moy_age := age / nb_particip;
SELECT CONCAT('La moyenne d age de la population participant aux services et aux jeux SMS est', moy_age);
END
Le SELECT COUNT() n'est pas bon car en copiant de wampserver à une page web,les étoiles se suppriment automatiquement.Mais le problème persiste encore:c'est lorsqu'on exécute la procédure,il n'y a qu'un seul affichage qui s'effectue:le dernier message aprés la boucle CASE ne s'effectue pas!!y_t_il une solution?
Si l'étoile se supprime automatiquement, ce n'est pas normal, Mais on peut contourner le problème en mettant le nom d'une colonne, par exemple la clé primaire, ce qui donnerait quelque chose du style :
SELECT COUNT(id) FROM nom_de_la_table;
Pour le reste, je ne sais pas trop, n'ayant pas la base, difficile de tester quoi que ce soit. Il faudrait pouvoir faire un débogage pas-à-pas et je ne connais qu'un seul outil qui permette de faire ça, DbForgeStudio for MySQL. Il faudrait pouvoir vérifier les valeurs de variables à tel ou tel endroit pour vérifier que ça correspond à ce qui est normalement attendu.
En exécutant chacune des requêtes de la procédure individuellement, il serait déjà possible de vérifier qu'elles ne contiennent pas d'erreur et retournent bien des valeurs cohérentes. Si ça s'arrête après un seul tour, c'est qu'il y a une erreur quelque part ou bien pas assez de données pour aller au-delà.