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 : 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;
/
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
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 : 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;
/
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 !

[/quote]