[quotemsg=1747140,1,8513]Bonjour,
j'ai besoin d'aide pour mon trigger sous Oracle 10g.
Je recupére des données (information d'employé) d'un fichier csv grâce à SQL*Loader que je dois mettre dans une table t_cedd_main. Je souhaiterais avec mon trigger inserer ou mettre a jour les lignes de ma tables suivant s'il y a de nouveaux employés dans le fichier csv ou bien des données modifiée
##############################################
Il existe deux types de triggers.
STATEMENT (DÉFAUT)
EXÉCUTÉ 1 FOIS
NE PERMET PAS DE TRAVAILLER DANS LE TRIGGER POUR CHAQUE TUPLE SUR LES ANCIENNES VALEURS ET LES NOUVELLES VALEURS
ROW (FOR EACH ROW)
EXÉCUTÉ AUTANT DE FOIS QUE DE TUPLES TOUCHÉS PAR LA MAJ
PERMET DE TRAVAILLER DANS LE TRIGGER SUR CHAQUE TUPLE MIS À JOUR
(ANCIENNES ET NOUVELLES VALEURS)
CONTRAINTES DANS LE PL / SQL
MAIS NE PERMET PAS DE MANIPULER LA TABLE SU LAQUELLE EST POSER LE TRIGGER, ON PEUT UNIQUEMENT MODIFIER LES DONNEES new. En cas de BEFORE
EXEMLE:
- solution avec un « STATEMENT TRIGGER »
On laisse s’effectuer d’abord toutes les mises à jour et on vérifie après coup que celles-ci n’engendrent pas la présence de plus d’un président.
*/
create or replace trigger check_president1
after update of job or insert on emp
declare
nbpresident number(2,0);
begin
select count (*) into nbpresident from emp where job = PRESIDENT';
if nbpresident > 1 then
raise_application_error ( -20002, 'IL NE PEUT Y AVOIR PLUS D UN PRESIDENT');
end if;
end;
/
- solution avec un « FOR EACH ROW TRIGGER »
On ne peut dans le PL /SQL d’un FOR EACH ROW TRIGGER faire de SELECT sur la table sur laquelle ce trigger est défini. La solution est donc plus complexe et doit faire intervenir une copie (partielle),table miroir de la table initiale sur laquelle la mise à jour est propagée.
*/
drop table empbis ;
create table empbis as select empno, job, mgr from emp ;
create or replace trigger propage
after delete or update or insert on emp
for each row
begin
if inserting then
insert into empbis values (:new.empno, :new.job,:new.mgr);
elsif deleting then
delete from empbis where empno = ld.empno;
elsif updating then
update empbis set job= :new.job,mgr = :new.mgr where empno =:old.empno;
end if;
end ;
/
/*
Si tout se passe bien dans les mises à jour de la table emp , ces mises à jour seront automatiquement transférées dans empbis.
Il suffit maintenant de poser un trigger en before sur emp qui reportera le select sur la table empbis.
*/
drop trigger check_president1 ;
create or replace trigger check_president2
before update of job or insert on emp
for each row
when (new.job = 'PRESIDENT')
declare
nbpresident number(2,0);
begin
select count (*) into nbpresident from empbis where job = 'PRESIDENT';
if nbpresident > 0 then
raise_application_error ( -20002, 'IL NE PEUT Y AVOIR PLUS D UN PRESIDENT');
end if;
end;
/*
On peut bien sûr envisager d’ autres combinaisons d’évènements et de timing de « FOR EACH ROW TRIGGER ».
Noter que le test sur nbpresident a changé !
j'espere que ca va t'aidé
Message édité par severnaja le 28-08-2008 à 16:58:05