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 :
Voici la procédure qui fonctionne bien :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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');
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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')$
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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')$
Partager