Code : SQL
DELIMITER |
CREATE PROCEDURE test_leave2(IN p_nombre INT)
corps_procedure: BEGIN
-- On donne un
label au bloc d'instructions principal
DECLARE v_i INT DEFAULT 4;
SELECT 'Avant la boucle WHILE';
while1: WHILE v_i > 0 DO
SET p_nombre = p_nombre + 1;
-- On incrémente le
nombre de 1
IF p_nombre%10 = 0 THEN
-- Si p_nombre est
divisible par 10,
SELECT 'Stop !' AS 'Multiple de 10';
LEAVE corps_procedure;
-- je quitte la
procédure.
END IF;
SELECT p_nombre;
-- On affiche
p_nombre
SET v_i = v_i - 1;
-- Attention de ne
pas l'oublier
END WHILE while1;
SELECT 'Après la boucle WHILE';
END|
DELIMITER ;
CALL test_leave2(8);
'Après la boucle WHILE' ne s'affiche plus lorsque l'instruction LEAVE est déclenchée, puisque l'on quitte la procédure
stockée avant d'arriver à l'instruction SELECT qui suit la boucle WHILE.
En revanche, LEAVE ne permet pas de quitter directement une structure conditionnelle (IF ou CASE). Il n'est d'ailleurs pas non
plus possible de donner un label à ces structures. Cette restriction est cependant aisément contournable en utilisant les blocs
d'instructions.
Exemple : la procédure suivante affiche les nombres de 4 à 1, en précisant s'ils sont pairs. Sauf pour le nombre 2, pour lequel une
instruction LEAVE empêche l'affichage habituel.
Code : SQL
DELIMITER |
CREATE PROCEDURE test_leave3()
BEGIN
DECLARE v_i INT DEFAULT 4;
WHILE v_i > 0 DO
IF v_i%2 = 0 THEN
if_pair: BEGIN
IF v_i = 2 THEN
-- Si v_i vaut 2
LEAVE if_pair;
-- On quitte le
bloc "if_pair", ce qui revient à quitter la structure IF v_i%2 = 0
END IF;
SELECT CONCAT(v_i, ' est pair') AS message;
END if_pair;
ELSE
if_impair: BEGIN
SELECT CONCAT(v_i, ' est impair') AS message;
END if_impair;
END IF;
SET v_i = v_i - 1;
Partie 5 : Sécuriser et automatiser ses actions
290/414
www.openclassrooms.com
Précédent

- 290/413

Suivant