Exercices⚓︎
Exercice 1⚓︎
Ecrire un programme qui pour chaque commande affiche le numéro et la date de commande sous la forme :
Commande N° : …… Effectuée le : …Pour un montant de …
Correction
🐬 SQL
DELIMITER |
CREATE PROCEDURE afficher_commandes()
BEGIN
DECLARE v_numCom INT;
DECLARE v_datCom DATE;
DECLARE v_montant DECIMAL(10,2);
DECLARE fin INT DEFAULT 0;
DECLARE cur_commandes CURSOR FOR
SELECT C.NumCom, DatCom, SUM(QteCommandee * PUArt) AS montant
FROM Commande C, LigneCommande LC, Article A
WHERE C.NumCom = LC.NumCom
AND LC.NumArt = A.NumArt
GROUP BY C.NumCom, DatCom;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 1;
OPEN cur_commandes;
boucle: LOOP
FETCH cur_commandes INTO v_numCom, v_datCom, v_montant;
IF fin = 1 THEN
LEAVE boucle;
END IF;
SELECT CONCAT(
'Commande N° : ', v_numCom,
' Effectuée le : ', DATE_FORMAT(v_datCom, '%d/%m/%Y'),
' Pour un montant de : ', v_montant, ' €'
) AS resultat;
END LOOP;
CLOSE cur_commandes;
END |
DELIMITER ;
CALL afficher_commandes();
Exercice 2⚓︎
Ecrire un programme qui pour chaque commande vérifie si cette commande a au moins un article. Si c'est le cas affiche son numéro et la liste de ses articles sinon affiche un message d'erreur (Attention ce cours ne contient pas la gestion des erreurs) :
Aucun article pour la commande …. Elle sera supprimée et supprime cette commande
Correction
🐬 SQL
DELIMITER |
CREATE PROCEDURE verifier_commandes()
BEGIN
DECLARE v_numCom INT;
DECLARE v_nbArt INT;
DECLARE fin INT DEFAULT 0;
DECLARE cur_commandes CURSOR FOR
SELECT NumCom FROM Commande;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET fin = 1;
OPEN cur_commandes;
boucle: LOOP
FETCH cur_commandes INTO v_numCom;
IF fin = 1 THEN
LEAVE boucle;
END IF;
-- Compter le nombre d'articles pour cette commande
SELECT COUNT(NumArt) INTO v_nbArt
FROM LigneCommande
WHERE NumCom = v_numCom;
IF v_nbArt > 0 THEN
-- Afficher le numéro de commande et la liste de ses articles
SELECT CONCAT('Commande N° : ', v_numCom) AS commande;
SELECT LC.NumArt, DesArt, PUArt, QteCommandee
FROM LigneCommande LC, Article A
WHERE LC.NumArt = A.NumArt
AND LC.NumCom = v_numCom;
ELSE
-- Afficher le message d'erreur et supprimer la commande
SELECT CONCAT(
'Aucun article pour la commande ', v_numCom,
'. Elle sera supprimée.'
) AS message;
DELETE FROM Commande WHERE NumCom = v_numCom;
END IF;
END LOOP;
CLOSE cur_commandes;
END |
DELIMITER ;
CALL verifier_commandes();