© Éditions Eyrolles
255
chapitre n° 7
Programmation avancée
Gestion des autres erreurs (SQLEXCEPTION)
Si une erreur non prévue en tant qu’exception (dans les clauses DECLARE HANDLER) se
produisait, le programme se terminerait anormalement en renvoyant l’erreur en question. La
directive SQLEXCEPTION couvre toutes les erreurs qui ne sont administrées ni par SQLWARNING ni par NOT FOUND.
Dans notre exemple (sélection d’une colonne d’une table), seule une erreur « interne » pourrait éventuellement se produire (base de données ou table inexistante, colonne de la table
inexistante ou d’un type différent de VARCHAR(4) ou autre erreur système).
MySQL ne permet pas, pour l’instant, de récupérer dynamiquement, au sein d’un sous-programme, le code et le message de l’erreur associée à une exception levée suite à une instruction SQL, et qui n’a pas été prévue dans un handler.
Tableau 7-12 Exceptions 1172 et NOT FOUND traitées avec CONTINUE
Code MySQL
Commentaires
CREATE PROCEDURE bdsoutou.procException1
(IN p_comp VARCHAR(4))
BEGIN
DECLARE flagNOTFOUND BOOLEAN DEFAULT 0;
DECLARE flagPlusDun BOOLEAN DEFAULT 0;
DECLARE var1 VARCHAR(20);
Déclaration de la procédure et
des variables.
;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET flagNOTFOUND :=1;
Bloc qui déclare les deux
exceptions.
SELECT nom INTO var1 FROM bdsoutou.Pilote
WHERE comp=p_comp;
IF flagNOTFOUND THEN
SELECT CONCAT('Il n''y a pas de pilote pour la
compagnie ',p_comp)
AS 'Resultat procException1';
ELSEIF flagPlusDun THEN
SELECT CONCAT('Il y a plusieurs pilotes
pour la compagnie ',p_comp)
AS 'Resultat procException1';
ELSE
SELECT CONCAT('Le seul pilote de la compagnie
',p_comp,' est ',var1)
AS 'Resultat procException1';
END IF;
Requête pouvant déclencher
l’exception prévue.
Test de gestion des erreurs.
Affichage du résultat.
END;
Fin de la procédure.
Web
DECLARE CONTINUE HANDLER FOR 1172
SET flagPlusDun :=1
255
chapitre n° 7
Programmation avancée
Gestion des autres erreurs (SQLEXCEPTION)
Si une erreur non prévue en tant qu’exception (dans les clauses DECLARE HANDLER) se
produisait, le programme se terminerait anormalement en renvoyant l’erreur en question. La
directive SQLEXCEPTION couvre toutes les erreurs qui ne sont administrées ni par SQLWARNING ni par NOT FOUND.
Dans notre exemple (sélection d’une colonne d’une table), seule une erreur « interne » pourrait éventuellement se produire (base de données ou table inexistante, colonne de la table
inexistante ou d’un type différent de VARCHAR(4) ou autre erreur système).
MySQL ne permet pas, pour l’instant, de récupérer dynamiquement, au sein d’un sous-programme, le code et le message de l’erreur associée à une exception levée suite à une instruction SQL, et qui n’a pas été prévue dans un handler.
Tableau 7-12 Exceptions 1172 et NOT FOUND traitées avec CONTINUE
Code MySQL
Commentaires
CREATE PROCEDURE bdsoutou.procException1
(IN p_comp VARCHAR(4))
BEGIN
DECLARE flagNOTFOUND BOOLEAN DEFAULT 0;
DECLARE flagPlusDun BOOLEAN DEFAULT 0;
DECLARE var1 VARCHAR(20);
Déclaration de la procédure et
des variables.
;
DECLARE CONTINUE HANDLER FOR NOT FOUND
SET flagNOTFOUND :=1;
Bloc qui déclare les deux
exceptions.
SELECT nom INTO var1 FROM bdsoutou.Pilote
WHERE comp=p_comp;
IF flagNOTFOUND THEN
SELECT CONCAT('Il n''y a pas de pilote pour la
compagnie ',p_comp)
AS 'Resultat procException1';
ELSEIF flagPlusDun THEN
SELECT CONCAT('Il y a plusieurs pilotes
pour la compagnie ',p_comp)
AS 'Resultat procException1';
ELSE
SELECT CONCAT('Le seul pilote de la compagnie
',p_comp,' est ',var1)
AS 'Resultat procException1';
END IF;
Requête pouvant déclencher
l’exception prévue.
Test de gestion des erreurs.
Affichage du résultat.
END;
Fin de la procédure.
Web
DECLARE CONTINUE HANDLER FOR 1172
SET flagPlusDun :=1
