execice 1 create or replace function fn_points_fidelite(Id_client Number) return Number IS V_pt_fidelite number; Begin Select sum(L.prix_total) Into V_pt_fidelite from ligne_Commande L, Commande CO where L.commande_id = CO.id AND CO.client_id = Id_client; V_pt_fidelite := floor(V_pt_fidelite/10); return V_pt_fidelite; Exception when No_data_found then return 0; end fn_points_fidelite; select fn_points_fidelite(16) from dual; declare cursor C_client IS Select id, nom from client; V_points number; Begin for v_client in c_client loop v_points := fn_points_fidelite(v_client.id); if (v_points < 2) then DBMS_OUTPUT.PUT_LINE(v_client.nom || 'à' || v_points || 'point de fidelité' ); else DBMS_OUTPUT.PUT_LINE(v_client.nom || 'à' || v_points || 'points de fidelités' ); end if; end loop; end; exercice 2 create or replace trigger trg_DeleteCommande Before delete on Commande for each row begin delete from ligne_commande L where L.commande_id = :old.id; end trg_DeleteCommande; exercice 3 create or replace trigger trg_DeleteClient Before delete on Client for each row begin delete from Commande CO where CO.client_id = :old.id; end trg_DeleteCommande; exercice 4 create table Client_His as select * from Client; delete from Client_His; create or replace trigger trg_DeleteClient before delete on Client for each row begin delete from Commande CO where CO.client_id = :old.id; insert into Client_His values (:old.id, :old.prenom, :old.nom, :old.email, :old.ville); end trg_DeleteCommande; exercice 5 la contrainte de suppression en cascade exercice 6 // faire manuellement (car la suppression ne marche pas) drop table Client cascade constraints; drop table Commande cascade constraints; drop table ligne_commande cascade constraints; CREATE TABLE client ( id INT PRIMARY KEY, prenom VARCHAR(255), nom VARCHAR(255), email VARCHAR(255), ville VARCHAR(255) ); CREATE TABLE commande ( id INT PRIMARY KEY, client_id INT, date_achat DATE, reference VARCHAR(255), 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, FOREIGN KEY (produit_id) REFERENCES produit(id) ); Exercice 7 create table CommandeAuditLog( Utilisateur VARCHAR(255), ActionSQL VARCHAR(3) CONSTRAINT type_enumere_requette CHECK (ActionSQL IN ('INS', 'DEL', 'UDP')), DateMAJ DATE, ActCol VARCHAR(255) ); CREATE OR REPLACE TRIGGER insertionCommandeAuditLog AFTER INSERT OR DELETE OR UPDATE ON Commande FOR EACH ROW DECLARE CURSOR c_attribut IS SELECT column_name FROM user_tab_columns WHERE table_name = 'COMMANDE'; nom_colonne VARCHAR(255); BEGIN IF INSERTING THEN INSERT INTO CommandeAuditLog VALUES (USER, 'INS', SYSDATE, null); ELSIF DELETING THEN INSERT INTO CommandeAuditLog VALUES (USER, 'DEL', SYSDATE, null); ELSIF UPDATING THEN OPEN c_attribut; LOOP FETCH c_attribut INTO nom_colonne ; IF UPDATING(nom_colonne) THEN INSERT INTO CommandeAuditLog VALUES (USER, 'UDP', SYSDATE, nom_colonne); END IF; EXIT WHEN c_attribut%NOTFOUND; END LOOP; CLOSE c_attribut; END IF; END combinedTrigger;