//Exo 1 : CREATE OR REPLACE FUNCTION fn_points_fidelite(client_id INT) RETURN INT IS va_total_point INT; BEGIN SELECT (SUM(prix_total)/10) INTO va_total_point FROM ligne_commande lc JOIN commande3 c ON c.id = lc.commande_id WHERE c.client_id = client_id; RETURN ROUND(va_total_point); EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Aucune commande'); END; DECLARE CURSOR c_points_fidelite IS SELECT nom, id FROM client WHERE client.client_id = :client_id; v_nom client.nom%TYPE; v_id client.id%TYPE; BEGIN OPEN c_points_fidelite; LOOP FETCH c_points_fidelite INTO v_nom, v_id; DBMS_OUTPUT.PUTLINE((v_nom||"a"||fn_point_fidelite(v_id)||"points de fidélité"), EXIT WHEN c_points_fidelite % NOT FOUND; END LOOP; CLOSE c_points_fidelite; END; / //Exo 2 : CREATE OR REPLACE TRIGGER trg_DeleteCommande3 BEFORE DELETE ON Commande3 FOR EACH ROW BEGIN DELETE FROM ligne_commande WHERE commande_id = :OLD.id; END; //Exo 3 : CREATE OR REPLACE TRIGGER trg_DeleteClient BEFORE DELETE ON client FOR EACH ROW BEGIN DELETE FROM Commande3 WHERE client_id = :OLD.id; DELETE FROM ligne_commande WHERE commande_id IN (SELECT id FROM Commande3 WHERE client_id = :OLD.id); END; //Exo 4 : CREATE TABLE Client_His ( id INT PRIMARY KEY, prenom VARCHAR(50), nom VARCHAR(50), email VARCHAR(100), ville VARCHAR(50), date_suppression DATE DEFAULT SYSDATE ); CREATE OR REPLACE TRIGGER trg_DeleteClient BEFORE DELETE ON client FOR EACH ROW BEGIN INSERT INTO Client_His (id, prenom, nom, email, ville, date_suppression) VALUES (:OLD.id, :OLD.prenom, :OLD.nom, :OLD.email, :OLD.ville, SYSDATE); DELETE FROM Commande WHERE client_id = :OLD.id; DELETE FROM ligne_commande WHERE commande_id IN (SELECT id FROM Commande WHERE client_id = :OLD.id); END; //Exo 6 : DROP TABLE ligne_commande; DROP TABLE Commande3; DROP TABLE Client; DROP TABLE Client_His; CREATE TABLE Client ( id INT PRIMARY KEY, prenom VARCHAR(50), nom VARCHAR(50), email VARCHAR(100), ville VARCHAR(50) ); CREATE TABLE Client_His ( id INT PRIMARY KEY, prenom VARCHAR(50), nom VARCHAR(50), email VARCHAR(100), ville VARCHAR(50), date_suppression DATE DEFAULT SYSDATE ); CREATE TABLE Commande3 ( id INT PRIMARY KEY, client_id INT, date_achat DATE, reference VARCHAR(50), FOREIGN KEY (client_id) REFERENCES Client(id) ON DELETE CASCADE ); CREATE TABLE ligne_commande ( id INT PRIMARY KEY, commande_id INT, produit_id INT, quantite INT, prix_total DECIMAL(10,2), FOREIGN KEY (commande_id) REFERENCES Commande(id) ON DELETE CASCADE ); //Exo 7 : CREATE TABLE CommandeAuditLog ( Utilisateur VARCHAR(50), ActionSQL VARCHAR(3), -- 'INS', 'DEL', ou 'UPD' DateMAJ DATE DEFAULT SYSDATE, ActCol VARCHAR(255) ); CREATE TRIGGER trg_AuditInsertCommande AFTER INSERT ON Commande FOR EACH ROW BEGIN INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol) VALUES (USER, 'INS', SYSDATE, 'N/A'); END; CREATE TRIGGER trg_AuditDeleteCommande AFTER DELETE ON Commande FOR EACH ROW BEGIN INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol) VALUES (USER, 'DEL', SYSDATE, 'N/A'); END; CREATE TRIGGER trg_AuditUpdateCommande AFTER UPDATE ON Commande FOR EACH ROW BEGIN DECLARE modified_columns VARCHAR(255); SET modified_columns = ''; IF :OLD.date_achat != :NEW.date_achat THEN SET modified_columns = CONCAT(modified_columns, 'date_achat, '); END IF; IF :OLD.reference != :NEW.reference THEN SET modified_columns = CONCAT(modified_columns, 'reference, '); END IF; SET modified_columns = RTRIM(modified_columns, ', '); INSERT INTO CommandeAuditLog (Utilisateur, ActionSQL, DateMAJ, ActCol) VALUES (USER, 'UPD', SYSDATE, modified_columns); END;