BUT2FA BD

This commit is contained in:
2026-01-15 13:31:16 +01:00
commit 22f16cb959
17 changed files with 1283 additions and 0 deletions

182
TP1/CG_TP1.txt Normal file
View File

@@ -0,0 +1,182 @@
1. Mettre à jour la colonne Prix_total de la table ligne_commande
Requête pour mettre à jour la colonne prix_total en fonction des quantite et prix_unitaire :
UPDATE ligne_commande
SET prix_total = quantite * (
SELECT prix_unitaire
FROM produit
WHERE produit.id = ligne_commande.produit_id
);
2. Implémenter les requêtes du TD
select *
from ligne_commande lc
join commande c
on lc.commande_id = c.id
where client_id = 16;
3. Montant total dépensé par chaque client, classé par ordre décroissant
SELECT
client.prenom,
client.nom,
SUM(ligne_commande.prix_total) AS montant_total
FROM
client
JOIN
commande ON client.id = commande.client_id
JOIN
ligne_commande ON commande.id = ligne_commande.commande_id
GROUP BY
client.prenom, client.nom
ORDER BY
montant_total DESC;
4. Clients ayant dépensé plus de 2000 euros
SELECT
client.prenom,
client.nom
FROM
client
JOIN
commande ON client.id = commande.client_id
JOIN
ligne_commande ON commande.id = ligne_commande.commande_id
GROUP BY
client.prenom, client.nom
HAVING
SUM(ligne_commande.prix_total) > 2000;
5. Chiffre daffaires par mois
SELECT
TO_CHAR(commande.date_achat, 'YYYY-MM') AS mois_annee,
SUM(ligne_commande.prix_total) AS chiffre_affaires
FROM
commande
JOIN
ligne_commande ON commande.id = ligne_commande.commande_id
GROUP BY
TO_CHAR(commande.date_achat, 'YYYY-MM')
ORDER BY
TO_CHAR(commande.date_achat, 'YYYY-MM');
6. Création de la séquence seq_tp
CREATE SEQUENCE seq_tp
START WITH 121
INCREMENT BY 1;
-- Afficher la valeur actuelle et suivante
SELECT seq_tp.CURRVAL, seq_tp.NEXTVAL FROM dual;
7. Procédure sp_insert_ligne_commande
Procédure pour insérer une ligne de commande en vérifiant l'existence de la commande et du produit :
CREATE OR REPLACE PROCEDURE sp_insert_ligne_commande(
p_commande_id INT,
p_produit_id INT,
p_quantite INT
) AS
v_prix_unitaire NUMBER;
BEGIN
-- Vérifier l'existence de la commande et du produit
IF NOT EXISTS (SELECT 1 FROM commande WHERE id = p_commande_id) THEN
RAISE_APPLICATION_ERROR(-20001, 'Commande inexistante.');
END IF;
IF NOT EXISTS (SELECT 1 FROM produit WHERE id = p_produit_id) THEN
RAISE_APPLICATION_ERROR(-20002, 'Produit inexistant.');
END IF;
-- Récupérer le prix unitaire
SELECT prix_unitaire
INTO v_prix_unitaire
FROM produit
WHERE id = p_produit_id;
-- Insérer la ligne de commande
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total)
VALUES (seq_tp.NEXTVAL, p_commande_id, p_produit_id, p_quantite, p_quantite * v_prix_unitaire);
END;
/
8. Procédure sp_insert_commande
Procédure pour insérer une commande avec vérification de l'existence du client :
CREATE OR REPLACE PROCEDURE sp_insert_commande(
p_client_id INT,
p_reference VARCHAR2
) AS
BEGIN
-- Vérifier l'existence du client
IF NOT EXISTS (SELECT 1 FROM client WHERE id = p_client_id) THEN
RAISE_APPLICATION_ERROR(-20003, 'Client inexistant.');
END IF;
-- Insérer la commande
INSERT INTO commande (id, client_id, date_achat, reference)
VALUES (seq_tp.NEXTVAL, p_client_id, SYSDATE, p_reference);
END;
/
9. Procédure sp_frais_livraison
Procédure pour calculer les frais de livraison selon le montant total d'une commande :
CREATE OR REPLACE PROCEDURE sp_frais_livraison(
p_commande_id INT,
p_frais_livraison OUT NUMBER
) AS
v_total_commande NUMBER;
BEGIN
-- Calculer le montant total de la commande
SELECT SUM(prix_total)
INTO v_total_commande
FROM ligne_commande
WHERE commande_id = p_commande_id;
-- Calculer les frais de livraison
IF v_total_commande >= 100 THEN
p_frais_livraison := 0;
ELSIF v_total_commande >= 50 THEN
p_frais_livraison := 4;
ELSE
p_frais_livraison := 10;
END IF;
END;
/