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 :
Pour mon trigger voici ma 1ere version (qui ne marche pas) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; /
Et la 2 eme version qui ne marche pas plus...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; /
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; /
Si quelqu'un a la patience de s'y pencher, merci d'avance !
[/quote]
Partager