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

129
CM_A_24/CG_CM_A_24.txt Normal file
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

116
CM_A_24/DS_CM_A_24.txt Normal file
View 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
View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 146 KiB

165
CM_I_25/DS_CM_I_25.txt Normal file
View 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

Binary file not shown.

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;
/

271
TP1/DATA_COMMANDE.sql Normal file
View 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

Binary file not shown.

164
TP2/CG_TP2.txt Normal file
View 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
Lorsquune 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 dun client
Lorsquun 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 dutiliser 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 dun 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 daudit
INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol)
VALUES (USER, v_action, SYSDATE, v_actCol);
END;
/
✅ Avantage : Permet davoir 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
View File

@@ -0,0 +1,130 @@
1. Procédure sp_Mise_A_Jour_Prix_Produit
Cette procédure met à jour le prix unitaire dun 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 dun 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 dajouter 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 dun produit.
2. Fonction fn_quantité_moyenne : Retourne la moyenne des quantités commandées dun produit.
3. Procédure sp_DateDernierAchat : Affiche la dernière date dachat dun 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 KiB

Binary file not shown.

BIN
cours/2-PLSQL-S3.pdf Normal file

Binary file not shown.

Binary file not shown.

BIN
cours/PLSQL_Google_Doc.pdf Normal file

Binary file not shown.