Partie II
Programmation procédurale
258
© Éditions Eyrolles
Dans cette procédure, une erreur sur la première requête interrompt le programme (après avoir
traité l’exception), et de ce fait la deuxième requête n’est pas évaluée. Pour cela, il est intéressant d’utiliser des blocs imbriqués pour poursuivre le traitement après avoir traité une ou
plusieurs exceptions.
Gestion de plusieurs exceptions
Le tableau suivant décrit une procédure qui traite toutes les mêmes exceptions en séquence.
Ce mécanisme permet de continuer l’exécution après que MySQL a levé une exception. Dans
cette procédure, les deux requêtes sont évaluées indépendamment du résultat retourné par
chacune d’elles.
Tableau 7-14 Une exception NOT FOUND traitée pour deux instructions
Code MySQL
Commentaires
CREATE PROCEDURE bdsoutou.procException2
(IN p_brevet VARCHAR(6),IN p_heures DECIMAL(7,2))
BEGIN
DECLARE v_nom
VARCHAR(20);
DECLARE flagNOTFOUND BOOLEAN DEFAULT 0;
DECLARE v_requete
TINYINT;
IF flagNOTFOUND THEN
IF v_requete = 1 THEN
SELECT CONCAT('Pas de pilote de brevet : ',p_brevet);
ELSEIF v_requete = 2 THEN
SELECT CONCAT('Pas de pilote ayant ce nombre
d''heures de vol : ',p_heures);
END IF;
END IF;
END;
Bloc avec les requêtes
déclenchant potentiellement
une exception prévue.
Traitement pour savoir
quelle requête a provoqué
l’exception.
Web
BEGIN
;
SET v_requete := 1;
SELECT nom INTO v_nom FROM bdsoutou.Pilote
WHERE brevet = p_brevet;
SELECT CONCAT('Le pilote de code ',p_brevet,
' est ',v_nom);
SET v_requete := 2;
SELECT nom INTO v_nom FROM bdsoutou.Pilote
WHERE nbHVol = p_heures;
SELECT CONCAT('Le pilote ayant ',p_heures,
' heures de vol est ',v_nom);
END;
DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND :=1
Programmation procédurale
258
© Éditions Eyrolles
Dans cette procédure, une erreur sur la première requête interrompt le programme (après avoir
traité l’exception), et de ce fait la deuxième requête n’est pas évaluée. Pour cela, il est intéressant d’utiliser des blocs imbriqués pour poursuivre le traitement après avoir traité une ou
plusieurs exceptions.
Gestion de plusieurs exceptions
Le tableau suivant décrit une procédure qui traite toutes les mêmes exceptions en séquence.
Ce mécanisme permet de continuer l’exécution après que MySQL a levé une exception. Dans
cette procédure, les deux requêtes sont évaluées indépendamment du résultat retourné par
chacune d’elles.
Tableau 7-14 Une exception NOT FOUND traitée pour deux instructions
Code MySQL
Commentaires
CREATE PROCEDURE bdsoutou.procException2
(IN p_brevet VARCHAR(6),IN p_heures DECIMAL(7,2))
BEGIN
DECLARE v_nom
VARCHAR(20);
DECLARE flagNOTFOUND BOOLEAN DEFAULT 0;
DECLARE v_requete
TINYINT;
IF flagNOTFOUND THEN
IF v_requete = 1 THEN
SELECT CONCAT('Pas de pilote de brevet : ',p_brevet);
ELSEIF v_requete = 2 THEN
SELECT CONCAT('Pas de pilote ayant ce nombre
d''heures de vol : ',p_heures);
END IF;
END IF;
END;
Bloc avec les requêtes
déclenchant potentiellement
une exception prévue.
Traitement pour savoir
quelle requête a provoqué
l’exception.
Web
BEGIN
;
SET v_requete := 1;
SELECT nom INTO v_nom FROM bdsoutou.Pilote
WHERE brevet = p_brevet;
SELECT CONCAT('Le pilote de code ',p_brevet,
' est ',v_nom);
SET v_requete := 2;
SELECT nom INTO v_nom FROM bdsoutou.Pilote
WHERE nbHVol = p_heures;
SELECT CONCAT('Le pilote ayant ',p_heures,
' heures de vol est ',v_nom);
END;
DECLARE EXIT HANDLER FOR NOT FOUND SET flagNOTFOUND :=1
