2023-11-29 16:08:44 +01:00
|
|
|
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
|
|
|
|
|
2023-12-18 21:05:47 +01:00
|
|
|
// faire manuellement (car la suppression ne marche pas)
|
2023-11-29 16:08:44 +01:00
|
|
|
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
|
|
|
|
|
2023-12-18 21:05:47 +01:00
|
|
|
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;
|