CREATE PROCEDURE ajouter_adoption_exit(IN p_client_id INT, IN
p_animal_id INT, IN p_date DATE, IN p_paye TINYINT)
BEGIN
DECLARE v_prix DECIMAL(7,2);
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
BEGIN
SELECT 'Une erreur est survenue...';
SELECT 'Arrêt prématuré de la procédure';
END;
SELECT 'Début procédure';
SELECT COALESCE(Race.prix, Espece.prix) INTO v_prix
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id
LEFT JOIN Race ON Race.id = Animal.race_id
WHERE Animal.id = p_animal_id;
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (p_animal_id, p_client_id, CURRENT_DATE(), p_date,
v_prix, p_paye);
SELECT 'Fin procédure' AS message;
END|
CREATE PROCEDURE ajouter_adoption_continue(IN p_client_id INT, IN
p_animal_id INT, IN p_date DATE, IN p_paye TINYINT)
BEGIN
DECLARE v_prix DECIMAL(7,2);
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SELECT 'Une erreur
est survenue...';
SELECT 'Début procédure';
SELECT COALESCE(Race.prix, Espece.prix) INTO v_prix
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id
LEFT JOIN Race ON Race.id = Animal.race_id
WHERE Animal.id = p_animal_id;
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (p_animal_id, p_client_id, CURRENT_DATE(), p_date,
v_prix, p_paye);
SELECT 'Fin procédure';
END|
DELIMITER ;
SET @date_adoption = CURRENT_DATE() + INTERVAL 7 DAY;
CALL ajouter_adoption_exit(18, 6, @date_adoption, 1);
CALL ajouter_adoption_continue(18, 6, @date_adoption, 1);
Les instructions définies par le gestionnaire sont bien exécutées, mais 'Fin procédure' n'est affiché que dans le cas de
ajouter_adoption_continue(), qui fait reprendre la procédure une fois l'erreur gérée. La procédure ajouter_adoption_exit()
utilise un bloc d'instructions et peut donc exécuter plusieurs instructions.
Définition de l'erreur gérée
Identifiant ou numéro MySQL de l'erreur
Voici la déclaration du gestionnaire dans la procédure ajouter_adoption_continue() :
Code : SQL
Partie 5 : Sécuriser et automatiser ses actions
296/414
www.openclassrooms.com
p_animal_id INT, IN p_date DATE, IN p_paye TINYINT)
BEGIN
DECLARE v_prix DECIMAL(7,2);
DECLARE EXIT HANDLER FOR SQLSTATE '23000'
BEGIN
SELECT 'Une erreur est survenue...';
SELECT 'Arrêt prématuré de la procédure';
END;
SELECT 'Début procédure';
SELECT COALESCE(Race.prix, Espece.prix) INTO v_prix
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id
LEFT JOIN Race ON Race.id = Animal.race_id
WHERE Animal.id = p_animal_id;
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (p_animal_id, p_client_id, CURRENT_DATE(), p_date,
v_prix, p_paye);
SELECT 'Fin procédure' AS message;
END|
CREATE PROCEDURE ajouter_adoption_continue(IN p_client_id INT, IN
p_animal_id INT, IN p_date DATE, IN p_paye TINYINT)
BEGIN
DECLARE v_prix DECIMAL(7,2);
DECLARE CONTINUE HANDLER FOR SQLSTATE '23000' SELECT 'Une erreur
est survenue...';
SELECT 'Début procédure';
SELECT COALESCE(Race.prix, Espece.prix) INTO v_prix
FROM Animal
INNER JOIN Espece ON Espece.id = Animal.espece_id
LEFT JOIN Race ON Race.id = Animal.race_id
WHERE Animal.id = p_animal_id;
INSERT INTO Adoption (animal_id, client_id, date_reservation,
date_adoption, prix, paye)
VALUES (p_animal_id, p_client_id, CURRENT_DATE(), p_date,
v_prix, p_paye);
SELECT 'Fin procédure';
END|
DELIMITER ;
SET @date_adoption = CURRENT_DATE() + INTERVAL 7 DAY;
CALL ajouter_adoption_exit(18, 6, @date_adoption, 1);
CALL ajouter_adoption_continue(18, 6, @date_adoption, 1);
Les instructions définies par le gestionnaire sont bien exécutées, mais 'Fin procédure' n'est affiché que dans le cas de
ajouter_adoption_continue(), qui fait reprendre la procédure une fois l'erreur gérée. La procédure ajouter_adoption_exit()
utilise un bloc d'instructions et peut donc exécuter plusieurs instructions.
Définition de l'erreur gérée
Identifiant ou numéro MySQL de l'erreur
Voici la déclaration du gestionnaire dans la procédure ajouter_adoption_continue() :
Code : SQL
Partie 5 : Sécuriser et automatiser ses actions
296/414
www.openclassrooms.com
