---FINAL
CREATE OR REPLACE TRIGGER TR_BEFORE_COMMANDE_PRODUITS_MONTANT_TOTAL
BEFORE DELETE OR UPDATE OF COMMANDE_ID,QUANTITE,PRODUIT_ID OR INSERT ON
COMMANDE_PRODUITS
FOR EACH ROW
DECLARE
V_PRIX PRODUITS.PRIX%TYPE;
V_PRIX_OLD PRODUITS.PRIX%TYPE;
BEGIN
--FOR INSERT
IF INSERTING THEN
SELECT PRIX INTO V_PRIX FROM PRODUITS WHERE ID =:NEW.PRODUIT_ID;
UPDATE COMMANDES SET MONTANT = MONTANT + (V_PRIX * :NEW.QUANTITE) WHERE
ID=:NEW.COMMANDE_ID;
--FOR DELETE
ELSIF DELETING THEN
SELECT PRIX INTO V_PRIX FROM PRODUITS WHERE ID =:OLD.PRODUIT_ID;
UPDATE COMMANDES SET MONTANT = MONTANT - (V_PRIX * :OLD.QUANTITE) WHERE
ID=:OLD.COMMANDE_ID;
--FOR UPDATE
ELSIF UPDATING THEN
SELECT PRIX INTO V_PRIX_OLD FROM PRODUITS WHERE ID =:OLD.PRODUIT_ID;
SELECT PRIX INTO V_PRIX FROM PRODUITS WHERE ID =:NEW.PRODUIT_ID;
IF :NEW.COMMANDE_ID != :OLD.COMMANDE_ID THEN
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD) WHERE ID
= :OLD.COMMANDE_ID;
UPDATE COMMANDES
SET MONTANT = MONTANT + (:NEW.QUANTITE * V_PRIX) WHERE ID
= :NEW.COMMANDE_ID;
ELSE
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD) + (:NEW.QUANTITE *
V_PRIX) WHERE ID = :NEW.COMMANDE_ID;
END IF;
END IF;
END;
---ENDFINAL
------🗸TESTÉ ET APPROUVÉ PAR ORACLE LUI-MÊME
----On ne peut pas modifier la commande_id ou le produit_id car les deux
représentent la clé primaire de la table commande_produits
---BLOOPER
CREATE OR REPLACE TRIGGER TR_BEFORE_COMMANDE_PRODUITS_MONTANT_TOTAL
BEFORE DELETE OR UPDATE OF COMMANDE_ID,QUANTITE,PRODUIT_ID OR INSERT ON
COMMANDE_PRODUITS
FOR EACH ROW
DECLARE
V_PRIX PRODUITS.PRIX%TYPE;
V_PRIX_OLD PRODUITS.PRIX%TYPE;
BEGIN
--FOR INSERT
IF INSERTING THEN
SELECT PRIX INTO V_PRIX FROM PRODUITS WHERE ID =:NEW.PRODUIT_ID;
UPDATE COMMANDES SET MONTANT = MONTANT + (V_PRIX * :NEW.QUANTITE) WHERE
ID=:NEW.COMMANDE_ID;
--FOR DELETE
ELSIF DELETING THEN
SELECT PRIX INTO V_PRIX FROM PRODUITS WHERE ID =:OLD.PRODUIT_ID;
UPDATE COMMANDES SET MONTANT = MONTANT - (V_PRIX * :OLD.QUANTITE) WHERE
ID=:OLD.COMMANDE_ID;
--FOR UPDATE
ELSIF UPDATING THEN
SELECT PRIX INTO V_PRIX_OLD FROM PRODUITS WHERE ID =:OLD.PRODUIT_ID;
SELECT PRIX INTO V_PRIX FROM PRODUITS WHERE ID =:NEW.PRODUIT_ID;
IF V_PRIX_OLD != V_PRIX AND :OLD.QUANTITE != :NEW.QUANTITE THEN
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD) + (:NEW.QUANTITE *
V_PRIX) WHERE ID = :NEW.COMMANDE_ID;
ELSIF V_PRIX_OLD != V_PRIX AND :OLD.QUANTITE = :NEW.QUANTITE THEN
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD) + (:NEW.QUANTITE *
V_PRIX) WHERE ID = :NEW.COMMANDE_ID;
ELSIF V_PRIX_OLD = V_PRIX AND :OLD.QUANTITE != :NEW.QUANTITE THEN
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD) + (:NEW.QUANTITE *
V_PRIX) WHERE ID = :NEW.COMMANDE_ID;
ELSIF V_PRIX_OLD = V_PRIX AND :OLD.QUANTITE = :NEW.QUANTITE THEN
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD) + (:NEW.QUANTITE *
V_PRIX) WHERE ID = :NEW.COMMANDE_ID;
ELSIF :OLD.COMMANDE_ID != :NEW.COMMANDE_ID THEN
UPDATE COMMANDES
SET MONTANT = MONTANT - (:OLD.QUANTITE * V_PRIX_OLD)
WHERE ID= :OLD.COMMANDE_ID;
UPDATE COMMANDES
SET MONTANT = MONTANT + (:NEW.QUANTITE * V_PRIX)
WHERE ID = :NEW.COMMANDE_ID;
END IF;
END IF;
END;
---ENDBLOOPER