BUT2FA BD
This commit is contained in:
129
CM_A_24/CG_CM_A_24.txt
Normal file
129
CM_A_24/CG_CM_A_24.txt
Normal file
@@ -0,0 +1,129 @@
|
||||
Exercice 1 :
|
||||
|
||||
|
||||
1. Fonction pour retourner le salaire moyen d'un JOB
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION get_salaire_moyen(p_job VARCHAR2)
|
||||
RETURN NUMBER AS
|
||||
salaire_moyen NUMBER;
|
||||
BEGIN
|
||||
SELECT AVG(SAL)
|
||||
INTO salaire_moyen
|
||||
FROM EMP
|
||||
WHERE JOB = p_job;
|
||||
|
||||
IF salaire_moyen IS NULL THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Le JOB spécifié n''existe pas.');
|
||||
END IF;
|
||||
|
||||
RETURN salaire_moyen;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
2. Afficher la liste des JOBs et leur salaire moyen par ordre décroissant
|
||||
|
||||
|
||||
SELECT
|
||||
JOB,
|
||||
AVG(SAL) AS Salaire_Moyen
|
||||
FROM
|
||||
EMP
|
||||
GROUP BY
|
||||
JOB
|
||||
ORDER BY
|
||||
Salaire_Moyen DESC;
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 2 :
|
||||
Trigger pour mettre à jour Nombre_Emp dans Suivi_Emp
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_update_nombre_emp
|
||||
AFTER INSERT OR DELETE OR UPDATE OF DEPTNO ON EMP
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
v_nombre_emp NUMBER;
|
||||
BEGIN
|
||||
-- Calculer le nombre d'employés pour le département affecté
|
||||
SELECT COUNT(*)
|
||||
INTO v_nombre_emp
|
||||
FROM EMP
|
||||
WHERE DEPTNO = :NEW.DEPTNO;
|
||||
|
||||
-- Mettre à jour la table Suivi_Emp
|
||||
UPDATE SUIVI_EMP
|
||||
SET Nombre_Emp = v_nombre_emp
|
||||
WHERE DEPTNO = :NEW.DEPTNO;
|
||||
|
||||
-- Si suppression ou transfert, mettre à jour l'ancien département
|
||||
IF UPDATING AND :OLD.DEPTNO IS NOT NULL AND :OLD.DEPTNO != :NEW.DEPTNO THEN
|
||||
SELECT COUNT(*)
|
||||
INTO v_nombre_emp
|
||||
FROM EMP
|
||||
WHERE DEPTNO = :OLD.DEPTNO;
|
||||
|
||||
UPDATE SUIVI_EMP
|
||||
SET Nombre_Emp = v_nombre_emp
|
||||
WHERE DEPTNO = :OLD.DEPTNO;
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 3 :
|
||||
Script pour mettre à jour la colonne COMM dans EMP en fonction de COMM_MIN
|
||||
|
||||
|
||||
BEGIN
|
||||
UPDATE EMP e
|
||||
SET COMM = (
|
||||
SELECT COMM_MIN
|
||||
FROM EMP_SEUIL es
|
||||
WHERE e.JOB = es.JOB
|
||||
)
|
||||
WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM EMP_SEUIL es
|
||||
WHERE e.JOB = es.JOB
|
||||
AND (e.COMM IS NULL OR e.COMM < es.COMM_MIN)
|
||||
);
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 4 :
|
||||
Procédure sp_update_commission pour mettre à jour COMM
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE sp_update_commission(p_job VARCHAR2, p_com NUMBER) AS
|
||||
BEGIN
|
||||
UPDATE EMP
|
||||
SET COMM = p_com
|
||||
WHERE JOB = p_job
|
||||
AND (COMM IS NULL OR COMM < p_com);
|
||||
|
||||
-- Vérification : Si la commission mise à jour est inférieure à COMM_MIN
|
||||
UPDATE EMP e
|
||||
SET COMM = (
|
||||
SELECT COMM_MIN
|
||||
FROM EMP_SEUIL es
|
||||
WHERE e.JOB = es.JOB
|
||||
AND es.JOB = p_job
|
||||
)
|
||||
WHERE EXISTS (
|
||||
SELECT 1
|
||||
FROM EMP_SEUIL es
|
||||
WHERE e.JOB = es.JOB
|
||||
AND es.JOB = p_job
|
||||
AND p_com < es.COMM_MIN
|
||||
);
|
||||
END;
|
||||
/
|
||||
BIN
CM_A_24/CM_A_24.jpg
Normal file
BIN
CM_A_24/CM_A_24.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 164 KiB |
116
CM_A_24/DS_CM_A_24.txt
Normal file
116
CM_A_24/DS_CM_A_24.txt
Normal file
@@ -0,0 +1,116 @@
|
||||
/* Exercice 1 */
|
||||
|
||||
On souhaite connaitre le salaire moyen des JOB. Ecrire une fonction qui prend en paramètre un JOB et retourne le salaire moyen du JOB. Traiter le cas où le JOB passé en paramètre n'existe pas.
|
||||
Afficher la liste des JOBs et leur salaire moyen par ordre décroissant de salaire.
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION avg_sal_job(p_job EMP.JOB%TYPE)
|
||||
RETURN NUMBER
|
||||
IS
|
||||
v_avg_sal NUMBER;
|
||||
v_job_count NUMBER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO v_job_count FROM EMP WHERE JOB = p_job;
|
||||
IF v_job_count = 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'JOB ' || p_job || ' n''existe pas');
|
||||
END IF;
|
||||
SELECT AVG(SAL) INTO v_avg_sal FROM EMP WHERE JOB = p_job;
|
||||
RETURN v_avg_sal;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Liste des JOBs et salaire moyen
|
||||
SELECT JOB, ROUND(AVG(SAL), 2) AS "Salaire moyen"
|
||||
FROM EMP
|
||||
GROUP BY JOB
|
||||
ORDER BY "Salaire moyen" DESC;
|
||||
|
||||
|
||||
|
||||
|
||||
/* Exercice 2 */
|
||||
|
||||
Créer 1 trigger qui met à jour automatiquement la colonne Nombre_Emp de la table Suivi_Emp si:
|
||||
- un nouvel employé est embauché dans un département
|
||||
- un nouvel employé démissionne
|
||||
- un employé est muté d'un département à un autre
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_update_suivi_emp
|
||||
AFTER INSERT OR DELETE OR UPDATE OF DEPTNO ON EMP
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
IF INSERTING THEN
|
||||
MERGE INTO SUIVI_EMP s
|
||||
USING DUAL ON (s.DEPTNO = :NEW.DEPTNO)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE SET s.Nombre_Emp = s.Nombre_Emp + 1
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (DEPTNO, Nombre_Emp) VALUES (:NEW.DEPTNO, 1);
|
||||
ELSIF DELETING THEN
|
||||
UPDATE SUIVI_EMP SET Nombre_Emp = Nombre_Emp - 1 WHERE DEPTNO = :OLD.DEPTNO;
|
||||
DELETE FROM SUIVI_EMP WHERE DEPTNO = :OLD.DEPTNO AND Nombre_Emp = 0;
|
||||
ELSIF UPDATING('DEPTNO') THEN
|
||||
-- Ancien département
|
||||
UPDATE SUIVI_EMP SET Nombre_Emp = Nombre_Emp - 1 WHERE DEPTNO = :OLD.DEPTNO;
|
||||
DELETE FROM SUIVI_EMP WHERE DEPTNO = :OLD.DEPTNO AND Nombre_Emp = 0;
|
||||
-- Nouveau département
|
||||
MERGE INTO SUIVI_EMP s
|
||||
USING DUAL ON (s.DEPTNO = :NEW.DEPTNO)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE SET s.Nombre_Emp = s.Nombre_Emp + 1
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (DEPTNO, Nombre_Emp) VALUES (:NEW.DEPTNO, 1);
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
/* Exercice 3 */
|
||||
|
||||
Ecrire un script qui met à jour le colonne COMM de la table EMP en fonction de la commission minimale COMM_MIN de la table EMP_SEUIL; Tout employé de la table EMP doit avoir une commission supérieure ou égale au montant de la commission minimale.
|
||||
- Si COMM is null → COMM_MIN
|
||||
- Si COMM < COMM_MIN COMM_MIN
|
||||
|
||||
|
||||
UPDATE EMP e
|
||||
SET COMM = (
|
||||
SELECT GREATEST(COALESCE(e.COMM, es.COMM_MIN), es.COMM_MIN)
|
||||
FROM EMP_SEUIL es
|
||||
WHERE es.JOB = e.JOB
|
||||
)
|
||||
WHERE EXISTS (
|
||||
SELECT 1 FROM EMP_SEUIL es WHERE es.JOB = e.JOB
|
||||
);
|
||||
|
||||
|
||||
|
||||
|
||||
/* Exercice 4 */
|
||||
|
||||
Ecrire une procédure sp_update_commission qui prend en paramètre un JOB p_job et une commission p_com. La procédure devra :
|
||||
- Mettre à jour la table EMP_SEUIL; le job p_job aura pour nouvelle commission p_com.
|
||||
- Mettre à jour la table EMP ; Si un employé ayant le job p_job a une commission inférieure à p_com, alors la commission doit être mise à jour (la commission doit toujours être supérieure à la commission minimale).
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE sp_update_commission (
|
||||
p_job EMP_SEUIL.JOB%TYPE,
|
||||
p_com EMP_SEUIL.COMM_MIN%TYPE
|
||||
)
|
||||
IS
|
||||
BEGIN
|
||||
MERGE INTO EMP_SEUIL d
|
||||
USING (SELECT p_job AS JOB, p_com AS COMM_MIN FROM DUAL) s
|
||||
ON (d.JOB = s.JOB)
|
||||
WHEN MATCHED THEN
|
||||
UPDATE SET d.COMM_MIN = s.COMM_MIN
|
||||
WHEN NOT MATCHED THEN
|
||||
INSERT (JOB, COMM_MIN) VALUES (s.JOB, s.COMM_MIN);
|
||||
|
||||
UPDATE EMP
|
||||
SET COMM = GREATEST(COALESCE(COMM, p_com), p_com)
|
||||
WHERE JOB = p_job;
|
||||
END;
|
||||
/
|
||||
126
CM_I_25/CG_CM_I_25.txt
Normal file
126
CM_I_25/CG_CM_I_25.txt
Normal file
@@ -0,0 +1,126 @@
|
||||
Exercice 1 : 4 points
|
||||
|
||||
|
||||
1. Liste des emprunts en cours (date_retour = NULL)
|
||||
|
||||
|
||||
SELECT
|
||||
Livres.titre AS Titre_Livre,
|
||||
Auteurs.nom AS Nom_Auteur,
|
||||
Auteurs.prenom AS Prenom_Auteur,
|
||||
Emprunts.membre_id AS Membre_ID
|
||||
FROM
|
||||
Emprunts
|
||||
JOIN
|
||||
Livres ON Emprunts.livre_id = Livres.livre_id
|
||||
JOIN
|
||||
Auteurs ON Livres.auteur_id = Auteurs.auteur_id
|
||||
WHERE
|
||||
Emprunts.date_retour IS NULL;
|
||||
|
||||
|
||||
2. Liste des livres empruntés pour une durée > 25 jours
|
||||
|
||||
|
||||
SELECT
|
||||
Livres.titre AS Titre_Livre,
|
||||
Emprunts.date_emprunt,
|
||||
Emprunts.date_retour,
|
||||
DATEDIFF(Emprunts.date_retour, Emprunts.date_emprunt) AS Duree_Emprunt
|
||||
FROM
|
||||
Emprunts
|
||||
JOIN
|
||||
Livres ON Emprunts.livre_id = Livres.livre_id
|
||||
WHERE
|
||||
DATEDIFF(Emprunts.date_retour, Emprunts.date_emprunt) > 25;
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 2 : 2 points
|
||||
Création de la séquence Livres_seq
|
||||
|
||||
|
||||
CREATE SEQUENCE Livres_seq
|
||||
START WITH 12
|
||||
INCREMENT BY 1;
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 3 : 5 points
|
||||
Procédure AjouterLivre
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE AjouterLivre(
|
||||
p_titre VARCHAR2,
|
||||
p_auteur_id INT,
|
||||
p_annee_publication INT,
|
||||
p_genre VARCHAR2,
|
||||
p_stock INT
|
||||
) AS
|
||||
BEGIN
|
||||
-- Vérification de l'existence de l'auteur
|
||||
IF NOT EXISTS (
|
||||
SELECT 1
|
||||
FROM Auteurs
|
||||
WHERE auteur_id = p_auteur_id
|
||||
) THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Auteur inexistant.');
|
||||
END IF;
|
||||
|
||||
-- Insertion du nouveau livre
|
||||
INSERT INTO Livres (livre_id, titre, auteur_id, annee_publication, genre, stock)
|
||||
VALUES (Livres_seq.NEXTVAL, p_titre, p_auteur_id, p_annee_publication, p_genre, p_stock);
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 4 : 3 points
|
||||
Fonction fn_nombre_livres_empruntes
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION fn_nombre_livres_empruntes(p_membre_id INT)
|
||||
RETURN INT AS
|
||||
nombre_emprunts INT;
|
||||
BEGIN
|
||||
SELECT COUNT(*)
|
||||
INTO nombre_emprunts
|
||||
FROM Emprunts
|
||||
WHERE membre_id = p_membre_id;
|
||||
|
||||
RETURN nombre_emprunts;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
Exercice 5 : 5 points
|
||||
Trigger trg_decrementer_stock_emprunt
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_decrementer_stock_emprunt
|
||||
BEFORE INSERT ON Emprunts
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
stock_actuel INT;
|
||||
BEGIN
|
||||
-- Vérification du stock
|
||||
SELECT stock INTO stock_actuel
|
||||
FROM Livres
|
||||
WHERE livre_id = :NEW.livre_id;
|
||||
|
||||
IF stock_actuel > 0 THEN
|
||||
-- Décrémenter le stock
|
||||
UPDATE Livres
|
||||
SET stock = stock - 1
|
||||
WHERE livre_id = :NEW.livre_id;
|
||||
ELSE
|
||||
-- Empêcher l'emprunt
|
||||
RAISE_APPLICATION_ERROR(-20002, 'Stock insuffisant pour emprunter ce livre.');
|
||||
END IF;
|
||||
END;
|
||||
/
|
||||
BIN
CM_I_25/CM_I_25.jpg
Normal file
BIN
CM_I_25/CM_I_25.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 146 KiB |
165
CM_I_25/DS_CM_I_25.txt
Normal file
165
CM_I_25/DS_CM_I_25.txt
Normal file
@@ -0,0 +1,165 @@
|
||||
/*
|
||||
A
|
||||
Nom et prénom : [Votre nom]
|
||||
Groupe : [Votre groupe]
|
||||
Salle TP : [Votre salle]
|
||||
Nom du voisin de gauche : [Nom]
|
||||
Nom du voisin de droite : [Nom]
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 1 : 4pts
|
||||
|
||||
1- Lister tous les emprunts en cours une date_retour qui a une valeur nulle. Vous devez afficher le titre du livre, le nom et le prenom de l'auteur et le membre_id.
|
||||
2- Afficher tous les livres qui ont été empruntés pour une durée supérieure à 25 jours
|
||||
|
||||
|
||||
-- 1. Liste des emprunts en cours (date_retour NULL)
|
||||
|
||||
SELECT l.titre, a.nom, a.prenom, e.membre_id
|
||||
FROM Emprunts e
|
||||
JOIN Livres l ON e.livre_id = l.livre_id
|
||||
JOIN Auteurs a ON l.auteur_id = a.auteur_id
|
||||
WHERE e.date_retour IS NULL;
|
||||
|
||||
|
||||
-- 2. Livres empruntés >25 jours (supposant date_retour renseignée)
|
||||
|
||||
SELECT l.titre, a.nom, a.prenom
|
||||
FROM Emprunts e
|
||||
JOIN Livres l ON e.livre_id = l.livre_id
|
||||
JOIN Auteurs a ON l.auteur_id = a.auteur_id
|
||||
WHERE (e.date_retour - e.date_emprunt) > 25;
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 2 : 2pts
|
||||
|
||||
Créer une séquence Livres_seq qui a pour première valeur 12 et s'incrémente de 1.
|
||||
|
||||
|
||||
CREATE SEQUENCE Livres_seq START WITH 12 INCREMENT BY 1;
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 3 : 5pts
|
||||
|
||||
Créer une procédure AjouterLivre(p_titre VARCHAR2, p_auteur_id INT, p_annee_publication INT, p_genre VACHAR2. p_stock INT) qui permet d'ajouter un nouveau livre à la bibliothèque.
|
||||
- Servez-vous de la séquence précédemment créée pour l'insertion de Livre_id.
|
||||
- Traitez le cas où l'auteur du livre à insérer n'existe pas dans la table Auteurs.
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE AjouterLivre(
|
||||
p_titre VARCHAR2,
|
||||
p_auteur_id INT,
|
||||
p_année_publication INT,
|
||||
p_genre VARCHAR2,
|
||||
p_stock INT
|
||||
) IS
|
||||
v_auteur_count INT;
|
||||
BEGIN
|
||||
-- Vérifier si l'auteur existe
|
||||
SELECT COUNT(*) INTO v_auteur_count FROM Auteurs WHERE auteur_id = p_auteur_id;
|
||||
IF v_auteur_count = 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'L''auteur n''existe pas.');
|
||||
END IF;
|
||||
|
||||
-- Insertion avec la séquence
|
||||
INSERT INTO Livres (livre_id, titre, auteur_id, année_publication, genre, stock)
|
||||
VALUES (Livres_seq.NEXTVAL, p_titre, p_auteur_id, p_année_publication, p_genre, p_stock);
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 4 : 4pts
|
||||
|
||||
Créer une fonction fn_nombre_livres_empruntes(p_membre_id INT) qui retourne le nombre de livres empruntés par un membre.
|
||||
Pour chaque membre présent dans la table Emprunt, afficher le nombre de livres empreintés.
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION fn_nombre_livres_empruntes(p_membre_id INT)
|
||||
RETURN INT IS
|
||||
v_count INT;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO v_count
|
||||
FROM Emprunts
|
||||
WHERE membre_id = p_membre_id AND date_retour IS NULL;
|
||||
RETURN v_count;
|
||||
END;
|
||||
/
|
||||
|
||||
-- Afficher pour chaque membre dans Emprunts
|
||||
SELECT DISTINCT membre_id, fn_nombre_livres_empruntes(membre_id) AS nombre_emprunts
|
||||
FROM Emprunts;
|
||||
|
||||
|
||||
|
||||
|
||||
-- Exercice 5 : 5pts
|
||||
|
||||
Créer un trigger trg_decremente_stock_emprunt qui permettra de gérer le stock des livres ; il s'exécutera avant l'insertion d'un nouvel emprunt et devra faire les vérifications ci-dessous:
|
||||
- Il vérifie que le stock est supérieur à 0: si c'est le cas, il décrémente de 1.
|
||||
- Une personne ne peut pas empreinte plus de 2 livres.
|
||||
- Si le stock est égal à 0, le trigger lève une erreur et empêche l'emprunt.
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_decremente_stock_emprunt
|
||||
BEFORE INSERT ON Emprunts
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
v_stock INT;
|
||||
v_emprunts_count INT;
|
||||
BEGIN
|
||||
-- Vérifier le stock
|
||||
SELECT stock INTO v_stock
|
||||
FROM Livres
|
||||
WHERE livre_id = :NEW.livre_id;
|
||||
|
||||
IF v_stock <= 0 THEN
|
||||
RAISE_APPLICATION_ERROR(-20002, 'Stock épuisé.');
|
||||
END IF;
|
||||
|
||||
-- Vérifier le nombre d'emprunts du membre
|
||||
SELECT COUNT(*) INTO v_emprunts_count
|
||||
FROM Emprunts
|
||||
WHERE membre_id = :NEW.membre_id AND date_retour IS NULL;
|
||||
|
||||
IF v_emprunts_count >= 2 THEN
|
||||
RAISE_APPLICATION_ERROR(-20003, 'Limite de 2 emprunts atteinte.');
|
||||
END IF;
|
||||
|
||||
-- Décrémenter le stock
|
||||
UPDATE Livres
|
||||
SET stock = stock - 1
|
||||
WHERE livre_id = :NEW.livre_id;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
-- Cas de tests
|
||||
|
||||
|
||||
-- Test Exercice 1.1 :
|
||||
-- INSERT INTO Emprunts (emprunt_id, livre_id, membre_id, date_emprunt, date_retour) VALUES (1, 101, 1, SYSDATE - 10, NULL);
|
||||
-- Résultat attendu : L'emprunt apparaît dans la liste.
|
||||
|
||||
|
||||
-- Test Exercice 1.2 :
|
||||
-- INSERT INTO Emprunts (emprunt_id, livre_id, membre_id, date_emprunt, date_retour) VALUES (2, 102, 2, SYSDATE - 30, SYSDATE);
|
||||
-- Résultat attendu : Le livre apparaît dans la liste.
|
||||
|
||||
|
||||
-- Test Exercice 3 :
|
||||
-- EXEC AjouterLivre('Nouveau Livre', 999, 2024, 'Roman', 5); -- Doit échouer si l'auteur 999 n'existe pas.
|
||||
|
||||
|
||||
-- Test Exercice 5 :
|
||||
-- INSERT INTO Emprunts (emprunt_id, livre_id, membre_id, date_emprunt) VALUES (3, 103, 3, SYSDATE); -- Doit échouer si stock = 0 ou si le membre a déjà 2 emprunts.
|
||||
BIN
TP1/1_TP_PLSQL.pdf
Normal file
BIN
TP1/1_TP_PLSQL.pdf
Normal file
Binary file not shown.
182
TP1/CG_TP1.txt
Normal file
182
TP1/CG_TP1.txt
Normal 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 d’affaires 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;
|
||||
/
|
||||
271
TP1/DATA_COMMANDE.sql
Normal file
271
TP1/DATA_COMMANDE.sql
Normal file
@@ -0,0 +1,271 @@
|
||||
|
||||
--DROP TABLE ligne_commande ;
|
||||
--DROP TABLE commande ;
|
||||
--DROP TABLE client ;
|
||||
--DROP TABLE produit;
|
||||
|
||||
--
|
||||
-- Table structure for table client
|
||||
--
|
||||
|
||||
|
||||
CREATE TABLE client (
|
||||
id NUMBER(10) NOT NULL ,
|
||||
prenom varchar2(255) NOT NULL,
|
||||
nom varchar2(255) NOT NULL,
|
||||
email varchar2(255) NOT NULL,
|
||||
ville varchar2(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
|
||||
CREATE TABLE commande (
|
||||
id NUMBER(2) NOT NULL ,
|
||||
client_id NUMBER(10) ,
|
||||
date_achat date NOT NULL,
|
||||
reference varchar2(255) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
ALTER TABLE commande ADD CONSTRAINTS fk_client FOREIGN KEY(client_id) REFERENCES client(id);
|
||||
|
||||
CREATE TABLE produit (
|
||||
id NUMBER(2) NOT NULL,
|
||||
nom_produit varchar2(255) NOT NULL,
|
||||
prix_unitaire NUMBER(10, 3) NOT NULL,
|
||||
PRIMARY KEY(id)
|
||||
);
|
||||
|
||||
-- la table ligne commande contient pour une commande donnée, tous les produits achetés lors de cette commande
|
||||
CREATE TABLE ligne_commande (
|
||||
id NUMBER(10) NOT NULL ,
|
||||
commande_id NUMBER(10) NOT NULL,
|
||||
produit_id NUMBER(2) NOT NULL,
|
||||
quantite NUMBER(10) NOT NULL,
|
||||
prix_total NUMBER(10, 3) NOT NULL,
|
||||
PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
--ALTER TABLE ligne_commande ADD CONSTRAINTS fk_commande FOREIGN KEY(commande_id) REFERENCES commande(id) on delete cascade;
|
||||
ALTER TABLE ligne_commande ADD CONSTRAINTS fk_commande FOREIGN KEY(commande_id) REFERENCES commande(id);
|
||||
ALTER TABLE ligne_commande ADD CONSTRAINT fk_produit FOREIGN KEY(produit_id) REFERENCES produit(id);
|
||||
|
||||
|
||||
--
|
||||
-- Dumping data for table client
|
||||
--
|
||||
REM INSERTING into client
|
||||
SET DEFINE OFF;
|
||||
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (1, 'Flavie', 'Da costa', 'f.da.costa@example.com', 'Pomoy');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (2, 'Valentin', 'Vespasien', 'valentin@example.com', 'Buvilly');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (3, 'Gustave', 'Collin', 'gust@example.com', 'Marseille');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (4, 'Emilien', 'Camus', 'emilien@example.com', 'Toulouse');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (5, 'Firmin', 'Marais', 'firmin.marais@example.com', 'Lyon');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (6, 'Olivier', 'Riou', 'olive.de.lugagnac@example.com', 'Lugagnac');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (7, 'Lucas', 'Jung', 'lucas.jung@example.com', 'Coulgens');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (8, 'Maurice', 'Huet', 'maurice.villemareuil@example.com', 'Villemareuil');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (9, 'Manon', 'Durand', 'm.durand.s.e@example.com', 'Saint-Etienne');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (10, 'Joachim', 'Leon', 'joachim@example.com', 'Longwy-sur-le-Doubs');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (11, 'Muriel', 'Dupuis', 'muriel@example.com', 'Paris');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (12, 'Christiane', 'Riou', 'chritianelesabrets@example.com', 'Les Abrets');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (13, 'Jacinthe', 'Langlois', 'jacinthe.langlois@example.com', 'Lagney');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (14, 'Amaury', 'Payet', 'amaury@example.com', 'Avermes');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (15, 'Maris', 'Buisson', 'maris@example.com', 'Le Havre');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (16, 'Fabrice', 'Foucher', 'fab.montlouis@example.com', 'Montlouis');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (17, 'Patrick', 'Saunier', 'patrick.saunier@example.com', 'Saligney');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (18, 'Emile', 'Ramos', 'emile@example.com', 'Arzay');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (19, 'Armel', 'Vigneron', 'armel.delain@example.com', 'Delain');
|
||||
INSERT INTO client (id, prenom, nom, email, ville) VALUES (20, 'Arnaude', 'Vallee', 'armaude.vallee@example.com', 'Hostias');
|
||||
COMMIT;
|
||||
|
||||
REM INSERTING into commande
|
||||
SET DEFINE OFF;
|
||||
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (1, 20, TO_DATE('2019-01-01','YYYY-MM-DD'), '004214');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (2, 3, TO_DATE('2019-01-03','YYYY-MM-DD'), '007120');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (3, 11, TO_DATE('2019-01-04','YYYY-MM-DD'), '002957');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (4, 6, TO_DATE('2019-01-07','YYYY-MM-DD'), '003425');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (5, 17, TO_DATE('2019-01-08','YYYY-MM-DD'), '008255');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (6, 7, TO_DATE('2019-01-09','YYYY-MM-DD'), '000996');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (7, 2, TO_DATE('2019-01-10','YYYY-MM-DD'), '000214');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (8, 7, TO_DATE('2019-01-11','YYYY-MM-DD'), '008084');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (9, 12, TO_DATE('2019-01-11','YYYY-MM-DD'), '009773');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (10, 16, TO_DATE('2019-01-13','YYYY-MM-DD'), '004616');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (11, 4, TO_DATE('2019-01-14','YYYY-MM-DD'), '003757');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (12, 9, TO_DATE('2019-01-15','YYYY-MM-DD'), '004939');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (13, 14, TO_DATE('2019-01-16','YYYY-MM-DD'), '003421');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (14, 6, TO_DATE('2019-01-16','YYYY-MM-DD'), '002286');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (15, 3, TO_DATE('2019-01-17','YYYY-MM-DD'), '001167');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (16, 15, TO_DATE('2019-01-18','YYYY-MM-DD'), '008974');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (17, 9, TO_DATE('2019-01-19','YYYY-MM-DD'), '001369');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (18, 17, TO_DATE('2019-01-20','YYYY-MM-DD'), '009924');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (19, 3, TO_DATE('2019-01-21','YYYY-MM-DD'), '005510');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (20, 17, TO_DATE('2019-01-22','YYYY-MM-DD'), '007778');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (21, 17, TO_DATE('2019-01-23','YYYY-MM-DD'), '002359');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (22, 15, TO_DATE('2019-01-25','YYYY-MM-DD'), '008459');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (23, 4, TO_DATE('2019-01-27','YYYY-MM-DD'), '005217');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (24, 12, TO_DATE('2019-01-29','YYYY-MM-DD'), '000706');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (25, 9, TO_DATE('2019-02-01','YYYY-MM-DD'), '007879');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (26, 8, TO_DATE('2019-02-02','YYYY-MM-DD'), '007277');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (27, 11, TO_DATE('2019-02-02','YYYY-MM-DD'), '002745');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (28, 11, TO_DATE('2019-02-03','YYYY-MM-DD'), '001893');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (29, 20, TO_DATE('2019-02-04','YYYY-MM-DD'), '001230');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (30, 10, TO_DATE('2019-02-05','YYYY-MM-DD'), '000469');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (31, 7, TO_DATE('2019-02-05','YYYY-MM-DD'), '008653');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (32, 3, TO_DATE('2019-02-06','YYYY-MM-DD'), '001858');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (33, 14, TO_DATE('2019-02-07','YYYY-MM-DD'), '003330');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (34, 2, TO_DATE('2019-02-08','YYYY-MM-DD'), '001074');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (35, 5, TO_DATE('2019-02-08','YYYY-MM-DD'), '005379');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (36, 16, TO_DATE('2019-02-09','YYYY-MM-DD'), '003672');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (37, 10, TO_DATE('2019-02-09','YYYY-MM-DD'), '002220');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (38, 19, TO_DATE('2019-02-10','YYYY-MM-DD'), '000086');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (39, 8, TO_DATE('2019-02-11','YYYY-MM-DD'), '003770');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (40, 2, TO_DATE('2019-02-12','YYYY-MM-DD'), '008590');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (41, 2, TO_DATE('2019-02-12','YYYY-MM-DD'), '001639');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (42, 4, TO_DATE('2019-02-13','YYYY-MM-DD'), '002426');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (43, 13, TO_DATE('2019-02-14','YYYY-MM-DD'), '007209');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (44, 13, TO_DATE('2019-02-15','YYYY-MM-DD'), '008768');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (45, 7, TO_DATE('2019-02-16','YYYY-MM-DD'), '002213');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (46, 12, TO_DATE('2019-02-17','YYYY-MM-DD'), '004759');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (47, 19, TO_DATE('2019-02-18','YYYY-MM-DD'), '007155');
|
||||
INSERT INTO commande (id, client_id, date_achat, reference) VALUES (48, 2, TO_DATE('2019-02-19','YYYY-MM-DD'), '001496');
|
||||
COMMIT;
|
||||
|
||||
REM INSERTING into Produit
|
||||
SET DEFINE OFF;
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (00, 'Produit0', 49.57);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (01, 'Produit1', 10.99);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (02, 'Produit2', 100.10);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (03, 'Produit3', 20);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (04, 'Produit4', 72.98);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (05, 'Produit5', 9);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (06, 'Produit6', 0.99);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (07, 'Produit7', 44.50);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (08, 'Produit8', 112);
|
||||
INSERT INTO Produit(id, nom_produit, prix_unitaire) VALUES (09, 'Produit9', 5);
|
||||
COMMIT;
|
||||
|
||||
REM INSERTING into ligne_commande
|
||||
SET DEFINE OFF;
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (1, 1, 01, 3, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (2, 1, 09, 1, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (3, 1, 06, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (4, 2, 05, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (5, 2, 07, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (6, 3, 09, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (7, 4, 03, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (8, 4, 04, 10, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (9, 4, 07, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (10, 4, 08, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (11, 4, 09, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (12, 5, 00, 10, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (13, 5, 07, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (14, 6, 01, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (15, 7, 06, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (16, 7, 07, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (17, 7, 09, 3, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (18, 8, 05, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (19, 9, 07, 10, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (20, 10, 02, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (21, 10, 00, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (22, 10, 06, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (23, 10, 01, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (24, 11, 04, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (25, 12, 02, 1, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (26, 12, 09, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (27, 13, 03, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (28, 13, 00, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (29, 14, 01, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (30, 14, 00, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (31, 15, 07, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (32, 15, 02, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (33, 16, 02, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (34, 17, 03, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (35, 17, 06, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (36, 17, 04, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (37, 17, 01, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (38, 18, 04, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (39, 18, 01, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (40, 18, 03, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (41, 18, 02, 1, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (42, 19, 05, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (43, 20, 01, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (44, 20, 04, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (45, 20, 03, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (46, 21, 04, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (47, 21, 07, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (48, 22, 09, 3, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (49, 22, 01, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (50, 22, 02, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (51, 22, 06, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (52, 22, 09, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (53, 23, 00, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (54, 23, 08, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (55, 23, 09, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (56, 24, 09, 1, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (57, 24, 08, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (58, 24, 05, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (59, 25, 00, 1, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (60, 25, 06, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (61, 26, 07, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (62, 27, 01, 1, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (63, 27, 04, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (64, 28, 05, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (65, 28, 03, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (66, 29, 09, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (67, 29, 02, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (68, 29, 06, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (69, 30, 00, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (70, 31, 03, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (71, 31, 00, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (72, 32, 03, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (73, 32, 05, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (74, 32, 02, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (75, 32, 01, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (76, 33, 00, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (77, 33, 06, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (78, 33, 03, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (79, 34, 05, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (80, 35, 02, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (81, 36, 03, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (82, 37, 06, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (83, 37, 01, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (84, 38, 01, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (85, 38, 02, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (86, 39, 01, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (87, 39, 07, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (88, 40, 06, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (89, 40, 03, 3, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (90, 41, 08, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (91, 41, 06, 4, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (92, 42, 01, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (93, 42, 05, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (94, 43, 04, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (95, 43, 03, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (96, 44, 04, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (97, 44, 02, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (98, 44, 09, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (99, 44, 00, 3, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (100, 44, 06, 4,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (101, 45, 00, 3,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (102, 45, 06, 2,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (103, 45, 05, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (104, 45, 07, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (105, 46, 04, 3, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (106, 46, 09, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (107, 46, 05, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (108, 46, 03, 8, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (109, 46, 02, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (110, 47, 06, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (111, 47, 08, 6, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (112, 47, 09, 10,0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (113, 47, 01, 2, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (114, 47, 03, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (115, 48, 04, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (116, 48, 02, 5, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (117, 48, 03, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (118, 48, 05, 9, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (119, 48, 09, 7, 0);
|
||||
INSERT INTO ligne_commande (id, commande_id, produit_id, quantite, prix_total) VALUES (120, 48, 06, 4, 0);
|
||||
COMMIT;
|
||||
|
||||
BIN
TP2/2_TP_PLSQL.pdf
Normal file
BIN
TP2/2_TP_PLSQL.pdf
Normal file
Binary file not shown.
164
TP2/CG_TP2.txt
Normal file
164
TP2/CG_TP2.txt
Normal file
@@ -0,0 +1,164 @@
|
||||
1. Implémenter les questions du TD
|
||||
(Cela dépend des questions vues en TD. Tu peux exécuter ici celles qui sont pertinentes pour ton TP.)
|
||||
|
||||
|
||||
|
||||
|
||||
2. Trigger trg_DeleteCommande pour gérer la suppression des commandes
|
||||
Lorsqu’une commande est supprimée, toutes ses lignes de commande associées doivent être supprimées :
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_DeleteCommande
|
||||
BEFORE DELETE ON Commande
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
-- Supprimer les lignes de commande associées à la commande supprimée
|
||||
DELETE FROM ligne_commande WHERE commande_id = :OLD.id;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
3. Trigger trg_DeleteClient pour gérer la suppression d’un client
|
||||
Lorsqu’un client est supprimé, toutes ses commandes et leurs lignes de commande doivent être supprimées :
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_DeleteClient
|
||||
BEFORE DELETE ON Client
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
-- Supprimer les lignes de commande associées aux commandes du client
|
||||
DELETE FROM ligne_commande
|
||||
WHERE commande_id IN (SELECT id FROM Commande WHERE client_id = :OLD.id);
|
||||
|
||||
-- Supprimer les commandes du client
|
||||
DELETE FROM Commande WHERE client_id = :OLD.id;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
4. Alternative aux triggers des questions 2 et 3
|
||||
Plutôt que d’utiliser des triggers, on peut utiliser des contraintes de suppression en cascade (ON DELETE CASCADE) dans la création des tables. Cela garantit que la suppression d’un enregistrement entraîne automatiquement la suppression des enregistrements associés.
|
||||
Exemple lors de la création des tables :
|
||||
|
||||
|
||||
ALTER TABLE Commande
|
||||
ADD CONSTRAINT fk_client_commande FOREIGN KEY (client_id)
|
||||
REFERENCES Client(id) ON DELETE CASCADE;
|
||||
|
||||
ALTER TABLE ligne_commande
|
||||
ADD CONSTRAINT fk_commande_ligne FOREIGN KEY (commande_id)
|
||||
REFERENCES Commande(id) ON DELETE CASCADE;
|
||||
|
||||
|
||||
✅ Avantage : Plus efficace que les triggers, car cela est géré automatiquement par le moteur de la base de données.
|
||||
|
||||
|
||||
|
||||
|
||||
5. Historisation des clients supprimés
|
||||
|
||||
|
||||
a) Création de la table Client_His pour stocker les anciens clients :
|
||||
|
||||
|
||||
CREATE TABLE Client_His (
|
||||
id INT PRIMARY KEY,
|
||||
prenom VARCHAR2(50),
|
||||
nom VARCHAR2(50),
|
||||
email VARCHAR2(100),
|
||||
ville VARCHAR2(50),
|
||||
date_suppression DATE DEFAULT SYSDATE
|
||||
);
|
||||
|
||||
|
||||
b) Modification du trigger trg_DeleteClient pour enregistrer les clients supprimés :
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_DeleteClient
|
||||
BEFORE DELETE ON Client
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
-- Insérer les informations du client supprimé dans la table Client_His
|
||||
INSERT INTO Client_His (id, prenom, nom, email, ville, date_suppression)
|
||||
VALUES (:OLD.id, :OLD.prenom, :OLD.nom, :OLD.email, :OLD.ville, SYSDATE);
|
||||
|
||||
-- Supprimer les lignes de commande associées
|
||||
DELETE FROM ligne_commande
|
||||
WHERE commande_id IN (SELECT id FROM Commande WHERE client_id = :OLD.id);
|
||||
|
||||
-- Supprimer les commandes du client
|
||||
DELETE FROM Commande WHERE client_id = :OLD.id;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
✅ Avantage : Permet de conserver un historique des clients supprimés.
|
||||
|
||||
|
||||
|
||||
|
||||
6. Audit de la table Commande
|
||||
|
||||
|
||||
a) Création de la table CommandeAuditLog :
|
||||
|
||||
|
||||
CREATE TABLE CommandeAuditLog (
|
||||
Utilisateur VARCHAR2(100),
|
||||
ActionSQL VARCHAR2(3),
|
||||
DateMAJ DATE,
|
||||
ActCol VARCHAR2(200)
|
||||
);
|
||||
|
||||
|
||||
b) Trigger trg_AuditCommande pour enregistrer les actions sur Commande :
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_AuditCommande
|
||||
AFTER INSERT OR DELETE OR UPDATE ON Commande
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
v_action VARCHAR2(3);
|
||||
v_actCol VARCHAR2(200);
|
||||
BEGIN
|
||||
-- Déterminer l'action réalisée (INS, DEL, UPD)
|
||||
IF INSERTING THEN
|
||||
v_action := 'INS';
|
||||
ELSIF DELETING THEN
|
||||
v_action := 'DEL';
|
||||
ELSIF UPDATING THEN
|
||||
v_action := 'UPD';
|
||||
|
||||
-- Vérifier quelles colonnes ont été modifiées
|
||||
v_actCol := '';
|
||||
IF UPDATING('client_id') THEN v_actCol := v_actCol || 'client_id, '; END IF;
|
||||
IF UPDATING('date_achat') THEN v_actCol := v_actCol || 'date_achat, '; END IF;
|
||||
IF UPDATING('reference') THEN v_actCol := v_actCol || 'reference, '; END IF;
|
||||
|
||||
-- Supprimer la dernière virgule et espace
|
||||
v_actCol := RTRIM(v_actCol, ', ');
|
||||
END IF;
|
||||
|
||||
-- Insérer les informations dans la table d’audit
|
||||
INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol)
|
||||
VALUES (USER, v_action, SYSDATE, v_actCol);
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
✅ Avantage : Permet d’avoir un suivi des modifications sur la table Commande.
|
||||
|
||||
|
||||
|
||||
|
||||
Résumé des solutions implémentées :
|
||||
|
||||
1. Trigger trg_DeleteCommande → Supprime les lignes de commande avant la suppression d'une commande.
|
||||
2. Trigger trg_DeleteClient → Supprime les commandes et lignes de commande associées à un client.
|
||||
3. Alternative aux triggers → Utilisation de ON DELETE CASCADE.
|
||||
4. Historisation des clients → Création de Client_His pour stocker les clients supprimés.
|
||||
5. Audit des modifications sur Commande → Création de CommandeAuditLog avec un trigger trg_AuditCommande.
|
||||
130
TP3/CG_TP3.txt
Normal file
130
TP3/CG_TP3.txt
Normal file
@@ -0,0 +1,130 @@
|
||||
1. Procédure sp_Mise_A_Jour_Prix_Produit
|
||||
Cette procédure met à jour le prix unitaire d’un produit donné.
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE sp_Mise_A_Jour_Prix_Produit(
|
||||
Nom_Produit VARCHAR2,
|
||||
Nouveau_Prix_Unitaire NUMBER
|
||||
) AS
|
||||
BEGIN
|
||||
-- Vérification si le produit existe
|
||||
IF NOT EXISTS (SELECT 1 FROM Produit WHERE nom_produit = Nom_Produit) THEN
|
||||
RAISE_APPLICATION_ERROR(-20001, 'Produit inexistant.');
|
||||
END IF;
|
||||
|
||||
-- Mise à jour du prix unitaire
|
||||
UPDATE Produit
|
||||
SET prix_unitaire = Nouveau_Prix_Unitaire
|
||||
WHERE nom_produit = Nom_Produit;
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Le prix du produit ' || Nom_Produit || ' a été mis à jour.');
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
2. Fonction fn_quantité_moyenne
|
||||
Cette fonction retourne la moyenne des quantités commandées pour un produit donné.
|
||||
|
||||
|
||||
CREATE OR REPLACE FUNCTION fn_quantite_moyenne(
|
||||
nom_produit VARCHAR2
|
||||
) RETURN NUMBER AS
|
||||
moyenne_quantite NUMBER;
|
||||
BEGIN
|
||||
-- Vérification si le produit existe
|
||||
IF NOT EXISTS (SELECT 1 FROM Produit WHERE nom_produit = nom_produit) THEN
|
||||
RAISE_APPLICATION_ERROR(-20002, 'Produit inexistant.');
|
||||
END IF;
|
||||
|
||||
-- Calcul de la moyenne des quantités commandées
|
||||
SELECT AVG(quantite)
|
||||
INTO moyenne_quantite
|
||||
FROM ligne_commande
|
||||
WHERE produit_id = (SELECT id FROM Produit WHERE nom_produit = nom_produit);
|
||||
|
||||
RETURN moyenne_quantite;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
3. Procédure sp_DateDernierAchat
|
||||
Cette procédure affiche la dernière date d'achat d’un produit donné.
|
||||
|
||||
|
||||
CREATE OR REPLACE PROCEDURE sp_DateDernierAchat(
|
||||
Nom_Produit VARCHAR2
|
||||
) AS
|
||||
derniere_date DATE;
|
||||
BEGIN
|
||||
-- Vérification si le produit existe
|
||||
IF NOT EXISTS (SELECT 1 FROM Produit WHERE nom_produit = Nom_Produit) THEN
|
||||
RAISE_APPLICATION_ERROR(-20003, 'Produit inexistant.');
|
||||
END IF;
|
||||
|
||||
-- Récupération de la dernière date d'achat
|
||||
SELECT MAX(date_achat)
|
||||
INTO derniere_date
|
||||
FROM Commande c
|
||||
JOIN ligne_commande lc ON c.id = lc.commande_id
|
||||
WHERE lc.produit_id = (SELECT id FROM Produit WHERE nom_produit = Nom_Produit);
|
||||
|
||||
DBMS_OUTPUT.PUT_LINE('Le produit ' || Nom_Produit || ' a pour dernière date d''achat : ' || derniere_date);
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
4. Ajouter la colonne quantite_en_stock dans la table Produit
|
||||
Requête pour ajouter la colonne et l'initialiser avec une valeur par défaut :
|
||||
|
||||
|
||||
ALTER TABLE Produit ADD quantite_en_stock NUMBER DEFAULT 0;
|
||||
|
||||
-- Initialisation des valeurs de stock (exemple : 100 pour tous les produits)
|
||||
UPDATE Produit SET quantite_en_stock = 100 WHERE quantite_en_stock = 0;
|
||||
|
||||
|
||||
|
||||
|
||||
5. Trigger trg_GestionStock
|
||||
Ce trigger vérifie que la quantité commandée est inférieure ou égale au stock disponible avant d’ajouter une ligne de commande.
|
||||
|
||||
|
||||
CREATE OR REPLACE TRIGGER trg_GestionStock
|
||||
BEFORE INSERT ON ligne_commande
|
||||
FOR EACH ROW
|
||||
DECLARE
|
||||
v_stock_disponible NUMBER;
|
||||
BEGIN
|
||||
-- Vérifier le stock disponible pour le produit
|
||||
SELECT quantite_en_stock
|
||||
INTO v_stock_disponible
|
||||
FROM Produit
|
||||
WHERE id = :NEW.produit_id;
|
||||
|
||||
IF :NEW.quantite > v_stock_disponible THEN
|
||||
RAISE_APPLICATION_ERROR(-20004, 'Quantité commandée supérieure au stock disponible.');
|
||||
END IF;
|
||||
|
||||
-- Mise à jour du stock
|
||||
UPDATE Produit
|
||||
SET quantite_en_stock = quantite_en_stock - :NEW.quantite
|
||||
WHERE id = :NEW.produit_id;
|
||||
END;
|
||||
/
|
||||
|
||||
|
||||
|
||||
|
||||
Résumé des solutions :
|
||||
|
||||
1. Procédure sp_Mise_A_Jour_Prix_Produit : Met à jour le prix unitaire d’un produit.
|
||||
2. Fonction fn_quantité_moyenne : Retourne la moyenne des quantités commandées d’un produit.
|
||||
3. Procédure sp_DateDernierAchat : Affiche la dernière date d’achat d’un produit.
|
||||
4. Ajout de la colonne quantite_en_stock : Permet de gérer les stocks des produits.
|
||||
5. Trigger trg_GestionStock : Vérifie et met à jour le stock avant insertion dans ligne_commande.
|
||||
BIN
TP3/TP3.jpg
Normal file
BIN
TP3/TP3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 428 KiB |
BIN
cours/1-NORMALISATION-S3.pdf
Normal file
BIN
cours/1-NORMALISATION-S3.pdf
Normal file
Binary file not shown.
BIN
cours/2-PLSQL-S3.pdf
Normal file
BIN
cours/2-PLSQL-S3.pdf
Normal file
Binary file not shown.
BIN
cours/Fiche_de_révision_BD.pdf
Normal file
BIN
cours/Fiche_de_révision_BD.pdf
Normal file
Binary file not shown.
BIN
cours/PLSQL_Google_Doc.pdf
Normal file
BIN
cours/PLSQL_Google_Doc.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user