-- Pour les tables Producteur et Vin ecrire pour chacune un trigger qui permet de générer
-- automatiquement les clés (utilisation d'une séquence).

-- Création des séquences qui servira à affecter les clés primaires
create sequence seqProd start with 5;
create sequence seqVin start with 4;

-- Génération d'une clé primaire pour la table PRODUCTEUR
--Tu crées un trigger qui agit à chaque INSERT : 
--tu récupères la prochaine valeur de la séquence SeqProducteur et tu la fous dans le champ numprod de ta nouvelle entrée 
--(le FROM dual, c'est parce que Oracle t'oblige à travailler avec une table, dual c'est la table factice de travail).
create or replace trigger genClePrimaireProducteur
before insert on producteur for each row
begin
  select seqProd.nextval into :new.numprod from dual;
  :new.numprod := 'p'||:new.numprod;
end;

--Pour tester ce trigger
insert into producteur (nom, prenom, region, qtetot) values ('monNom','monPrenom','maRegion',0);

-- Génération d'une clé primaire pour la table PRODUCTEUR
create or replace trigger genClePrimaireVin
before insert on VIN for each row
begin
  select seqVin.nextval into :new.numVin from dual;
  :new.numVin := 'v'||:new.numVin;
end;

--Pour tester ce trigger
insert into VIN (cru, annee, degre) values ('monCru',2000,10);

--Ecrire en PL/SQL un déclencheur (trigger) permettant de mettre à jour l'attribut Quantité totale à
-- chaque insertion d'une ligne dans la table récolte.

CREATE OR REPLACE TRIGGER majprod
BEFORE insert on recolte for each row
begin
UPDATEproducteur set qtetot=qtetot + :new.quantite
where numprod = :new.numprod ;
exception
WHEN OTHERS THEN
end;
/

--Ecrire en PL/SQL un déclencheur (trigger) permettant de mettre à jour l'attribut Quantité totale à
--chaque mise à jour dans la table récolte.


CREATE OR REPLACE TRIGGER majprod
BEFORE INSERT or UPDATE or delete on recolte for each row
begin
IF inserting THEN
UPDATE producteur SET qtetot=qtetot + :new.quantite
WHERE numprod = :new.numprod ;
ELSIF updating THEN
-- On met à jour la quantité totale du nouveau producteur
UPDATE producteur SET qtetot=qtetot + :new.quantite
WHERE numprod = :new.numprod ;
-- On met à jour la quantité totale de l'ancien producteur
UPDATE producteur SET qtetot = qtetot - :old.quantite
WHERE numprod = :old.numprod ;
ELSE
UPDATE producteur SET qtetot=qtetot - :old.quantite
WHERE numprod = :new.numprod ;
END IF;
exception
WHEN OTHERS THEN
null;
end;


