récupérer l'erreur après SIGNAL (MySQL 5.5)
Bonjour à tous
Apparue avec la 5.5, SIGNAL permet de quitter le bloc en cours en retournant un code erreur, libelle et SQLSTATE.
A la sortie d'une procédure ça va (voir le test), mais comment récupérer ces informations à la sortie du bloc (en supposant que j'appelle la procédure dans un autre bloc) ?
J'ai rien trouvé sur le Web, et la doc MySQL est plutôt pitoyable...
Voici les données :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
CREATE TABLE Pilote
(brevet VARCHAR(6),nom VARCHAR(20), nbHVol DECIMAL(7,2), comp VARCHAR(4),
CONSTRAINT pk_Pilote PRIMARY KEY(brevet));
INSERT INTO Pilote VALUES ('PL-1', 'Gilles Laborde', 2450, 'AF');
INSERT INTO Pilote VALUES ('PL-2', 'Frédéric D''Almeyda', 900, 'AF');
INSERT INTO Pilote VALUES ('PL-3', 'Florence Périssel', 1000, 'SING');
INSERT INTO Pilote VALUES ('PL-4', 'Sonia Dietrich', 2450, 'CAST');
INSERT INTO Pilote VALUES ('PL-5', 'Christine Royo', 200, 'AF');
INSERT INTO Pilote VALUES ('PL-6', 'Aurélia Ente', 2450, 'SING'); |
Voici la procédure qui fonctionne bien :
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 25 26 27 28 29 30 31 32
|
delimiter $
CREATE PROCEDURE exsignal1(IN p_brevet VARCHAR(6))
BEGIN
DECLARE v_nbHv DECIMAL(7,2);
DECLARE v_comp VARCHAR(4);
DECLARE pilote_trop_bleu CONDITION FOR SQLSTATE '45000';
SELECT comp,nbHVol INTO v_comp,v_nbHv FROM bdsoutou.Pilote WHERE brevet = p_brevet;
IF (v_nbHv < 1000) THEN
SIGNAL pilote_trop_bleu
SET MESSAGE_TEXT='Pilote trop peu experimente.',
MYSQL_ERRNO = 1001;
ELSEIF (v_comp != 'AF') THEN
SIGNAL SQLSTATE '01000'
SET MESSAGE_TEXT = 'Warning, pas Air France',
MYSQL_ERRNO = 1000;
ELSE
SELECT p_brevet,v_nbHv,v_comp;
END IF;
END;
$
CALL exsignal1('PL-5')$
SHOW ERRORS$
CALL exsignal1('PL-6')$
SHOW WARNINGS$
CALL exsignal1('PL-1')$ |
Le problème survient, quand j'essaie d'appeler cette procédure dans une autre et de récupérer les messages d'erreur. Le Warning saute, l'erreur est déroutée mais le libelle n'est pas renvoyé.
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 25 26 27 28
|
CREATE PROCEDURE exsignal2(IN p_brevet VARCHAR(6))
BEGIN
DECLARE v_flag TINYINT DEFAULT 0;
DECLARE CONTINUE HANDLER
-- (idem) FOR SQLWARNING SET v_flag = 1;
FOR SQLSTATE '01000' SET v_flag = 1;
DECLARE CONTINUE HANDLER
FOR SQLSTATE VALUE '45000' SET v_flag = 2;
CALL exsignal1(p_brevet);
CASE
WHEN v_flag=0 THEN SELECT 'Pilote OK';
WHEN v_flag=1 THEN
SELECT 'v_flag=1';
SHOW WARNINGS;
WHEN v_flag=2 THEN
SELECT 'v_flag=2';
SHOW ERRORS;
END CASE;
END;
$
CALL bdsoutou.exsignal2('PL-5')$
CALL bdsoutou.exsignal2('PL-6')$
CALL bdsoutou.exsignal2('PL-1')$ |