PL/SQL problème sur Trigger
Bonjour,
Je débute en ce qui concerne les trigger sous Oracle et j'ai beau m'acharner mais celui que j'essaye de faire ne marche pas...
Je travaille sur 2 tables : Emp et Dept (Employés et Départements)
Dans la table Emp j'ai les employés avec leur métier (JOB) et leur numéro de département (DEPTNO).
Dans la table Dept j'ai les départements (DEPTNO) et le nombre de métier par département (NbMetierDep).
Pour mettre à jour la colonne NbMetierDep j'ai créer une fonction :
Code:
1 2 3 4 5 6 7 8
|
CREATE OR REPLACE FUNCTION Departement (dept NUMBER) RETURN NUMBER IS
metier NUMBER;
BEGIN
SELECT COUNT(DISTINCT JOB) INTO metier FROM emp WHERE DEPTNO = dept;
RETURN metier;
END;
/ |
Pour mon trigger voici ma 1ere version (qui ne marche pas) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
CREATE OR REPLACE TRIGGER majNbMetierDept
BEFORE INSERT OR DELETE OR UPDATE OF JOB ON Emp
FOR EACH ROW
BEGIN
CASE
WHEN INSERTING THEN
UPDATE dept SET NbMetierDep = Departement(:NEW.deptno)
WHERE deptno = :NEW.deptno;
WHEN DELETING THEN
UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
WHERE deptno = :OLD.deptno;
WHEN UPDATING THEN
UPDATE dept SET NbMetierDep = Departement(:NEW.deptno)
WHERE deptno = :NEW.deptno;
UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
WHERE deptno = :OLD.deptno;
END CASE;
END;
/ |
Et la 2 eme version qui ne marche pas plus...
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
CREATE OR REPLACE TRIGGER majNbMetierDept
BEFORE INSERT OR DELETE OR UPDATE OF JOB ON Emp
FOR EACH ROW
DECLARE
CURSOR c1 IS SELECT * from dept;
C1_enr NUMBER;
BEGIN
C1_enr := 0;
CASE
WHEN INSERTING THEN
FOR c1_enr IN C1 LOOP
UPDATE dept SET NbMetierDep = Departement(:NEW.deptno)
WHERE deptno = :NEW.deptno;
END LOOP;
WHEN DELETING THEN
FOR c1_enr IN C1 LOOP
UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
WHERE deptno = :OLD.deptno;
END LOOP;
WHEN UPDATING THEN
FOR c1_enr IN C1 LOOP
UPDATE dept SET NbMetierDep = Departement(:NEW.deptno)
WHERE deptno = :NEW.deptno;
UPDATE dept SET NbMetierDep = Departement(:OLD.deptno)
WHERE deptno = :OLD.deptno;
END LOOP;
END CASE;
END;
/ |
En fait quand j'ajoute une ligne à Emp cela modifie bien mon nombre de metiers dans Dept mais quand je veux supprimer ou mettre à jour, il me dit que mon trigger ne vas pas voir le changement.
Si quelqu'un a la patience de s'y pencher, merci d'avance !
:oops: [/quote]