DECLARE violation_cle_etrangere CONDITION FOR 1452;
-
- Déclaration des CONDITIONS
DECLARE violation_unicite CONDITION FOR 1062;
DECLARE EXIT HANDLER FOR violation_cle_etrangere
-
- Déclaration du gestionnaire pour
BEGIN
-
- les erreurs de clés étrangères
SELECT 'Erreur : violation de clé étrangère.';
END;
DECLARE EXIT HANDLER FOR violation_unicite
-
- Déclaration du gestionnaire pour
BEGIN
-
- les erreurs d'index unique
SELECT 'Erreur : violation de contrainte d''unicité.';
END;
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
-
- Déclaration du gestionnaire pour
BEGIN
-
- toutes les autres erreurs ou avertissements
SELECT 'Une erreur est survenue...';
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';
END|
DELIMITER ;
SET @date_adoption = CURRENT_DATE() + INTERVAL 7 DAY;
CALL ajouter_adoption_exit(12, 3, @date_adoption, 1);
-Violation unicité (animal 3 est déjà adopté)
CALL ajouter_adoption_exit(133, 6, @date_adoption, 1);
-Violation clé étrangère (client 133 n'existe pas)
CALL ajouter_adoption_exit(NULL, 6, @date_adoption, 1);
-Violation de contrainte NOT NULL
Cette procédure montre également que lorsque plusieurs gestionnaires d'erreur peuvent correspondre à l'erreur déclenchée (ou à
l'avertissement), c'est le plus précis qui est utilisé. C'est la raison pour laquelle une violation de clé étrangère déclenche le
gestionnaire FOR violation_cle_etrangere (numéro MySQL 1062), et non le gestionnaire FOR SQLEXCEPTION.
Curseurs
Nous avons vu qu'il était possible d'exploiter le résultat d'un SELECT dans un bloc d'instructions, en utilisant la commande
SELECT colonne(s) INTO variable(s), qui assigne les valeurs sélectionnées à des variables.
Cependant, SELECT ... INTO ne peut être utilisé que pour des requêtes qui ne ramènent qu'une seule ligne de résultats.
Les curseurs permettent de parcourir un jeu de résultats d'une requête SELECT, quel que soit le nombre de lignes récupérées,
et d'en exploiter les valeurs.
Quatre étapes sont nécessaires pour utiliser un curseur.
Déclaration du curseur : avec une instruction DECLARE.
Ouverture du curseur : on exécute la requête SELECT du curseur et on stocke le résultat dans celui-ci.
Parcours du curseur : on parcourt une à une les lignes.
Fermeture du curseur.
Partie 5 : Sécuriser et automatiser ses actions
300/414
www.openclassrooms.com
-
- Déclaration des CONDITIONS
DECLARE violation_unicite CONDITION FOR 1062;
DECLARE EXIT HANDLER FOR violation_cle_etrangere
-
- Déclaration du gestionnaire pour
BEGIN
-
- les erreurs de clés étrangères
SELECT 'Erreur : violation de clé étrangère.';
END;
DECLARE EXIT HANDLER FOR violation_unicite
-
- Déclaration du gestionnaire pour
BEGIN
-
- les erreurs d'index unique
SELECT 'Erreur : violation de contrainte d''unicité.';
END;
DECLARE EXIT HANDLER FOR SQLEXCEPTION, SQLWARNING
-
- Déclaration du gestionnaire pour
BEGIN
-
- toutes les autres erreurs ou avertissements
SELECT 'Une erreur est survenue...';
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';
END|
DELIMITER ;
SET @date_adoption = CURRENT_DATE() + INTERVAL 7 DAY;
CALL ajouter_adoption_exit(12, 3, @date_adoption, 1);
-Violation unicité (animal 3 est déjà adopté)
CALL ajouter_adoption_exit(133, 6, @date_adoption, 1);
-Violation clé étrangère (client 133 n'existe pas)
CALL ajouter_adoption_exit(NULL, 6, @date_adoption, 1);
-Violation de contrainte NOT NULL
Cette procédure montre également que lorsque plusieurs gestionnaires d'erreur peuvent correspondre à l'erreur déclenchée (ou à
l'avertissement), c'est le plus précis qui est utilisé. C'est la raison pour laquelle une violation de clé étrangère déclenche le
gestionnaire FOR violation_cle_etrangere (numéro MySQL 1062), et non le gestionnaire FOR SQLEXCEPTION.
Curseurs
Nous avons vu qu'il était possible d'exploiter le résultat d'un SELECT dans un bloc d'instructions, en utilisant la commande
SELECT colonne(s) INTO variable(s), qui assigne les valeurs sélectionnées à des variables.
Cependant, SELECT ... INTO ne peut être utilisé que pour des requêtes qui ne ramènent qu'une seule ligne de résultats.
Les curseurs permettent de parcourir un jeu de résultats d'une requête SELECT, quel que soit le nombre de lignes récupérées,
et d'en exploiter les valeurs.
Quatre étapes sont nécessaires pour utiliser un curseur.
Déclaration du curseur : avec une instruction DECLARE.
Ouverture du curseur : on exécute la requête SELECT du curseur et on stocke le résultat dans celui-ci.
Parcours du curseur : on parcourt une à une les lignes.
Fermeture du curseur.
Partie 5 : Sécuriser et automatiser ses actions
300/414
www.openclassrooms.com
