Bonjour à tous,
Voila plusieurs jours que je travaille sur une question de Travaux pratiques de SQL sans trouver la réponse à ma question et ce malgré de très très nombreux tests. Je deviens totalement fou, je suis persuadé de passer non loin de la solution mais je rencontre toujours la même erreur.
Voila rapidement la chose :
J'ai ces trois tables-là
Employee(EmpNo, Name, Job, Mgr, Hiredate, Sal , Comm, DeptNo);
SalaryGrade(Grade, LoSal, HiSal);
Department(DeptNo, DName, Loc, NBEmployé, NBMétier);
La question est la suivante : Créer un déclencheur qui, pour chaque mise à jour (insertion ou suppression ou modification) de l’affectation d’un employé, incrémente ou décrémente le nombre d’employés par département.
J'utilise SQL Developer de Oracle
Je n'ai volontairement pas précisé la structure de création de mes tables car je pense pas que le problème vienne de la et surtout cela va surcharger mon message et démotiver les éventuelles réponses .
Pour ce faire, voila la solution que j'ai apportée :
1er ) je crée une fonction qui prend en paramètre DeptNo et qui me retourne le nombre d'employés pour ce dernier
2) ensuite je crée une procédure faisant appel à la fonction ci-dessus, procédure qui me sera utile dans le trigger
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 CREATE OR REPLACE FUNCTION fonction4 (NoDépt IN Employee.DeptNo%TYPE) RETURN NUMBER IS CURSOR C1 IS SELECT * FROM Employee ; Nb NUMBER(3):=0; BEGIN FOR C1_enr IN C1 LOOP IF C1_enr.DeptNo = NoDépt THEN Nb := Nb + 1 ; END IF; END LOOP ; RETURN Nb; END fonction4 ;
Puis je crée le trigger se déclenchant lors d'une mise à jour sur la table employé, ce qui va lancer la procédure qui elle-même appelle la fonction qui va s'occuper de mettre à jour le champ NBEmployé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 CREATE OR REPLACE PROCEDURE NBEmploye AS CURSOR c IS SELECT * FROM Department; Nb NUMBER; BEGIN FOR Cur IN c LOOP Nb := fonction4(Cur.DeptNo); UPDATE Department SET NBEmployé = Nb WHERE DeptNo = Cur.DeptNo; END LOOP; END;
Tout se passe bien mais quand je fais un test du style
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 CREATE OR REPLACE TRIGGER Incremente AFTER INSERT OR DELETE OR UPDATE OF EmpNo ON Employee FOR EACH ROW BEGIN NBEmploye() ; END ;
DELETE FROM Employee WHERE EmpNo = 'un numéro d'employé de ma base', eh bien en sortie j'ai une jolie erreur me disant "La table EMPLOYEE est en mutation ; le déclencheur ou la fonction ne peut la voir"
Je comprends cette erreur mais je n'ai pas réussi à la contourner. A savoir que j'ai cherché pleiiiiins de méthodes, et que je vous donne celle qui me semble être la plus propre et surtout la plus juste. Celle que je rendrais si je ne trouve pas de solution à mon problème.
Avez-vous des suggestions ? Je suis preneur, merci d'avance !
Bonne journée.
Edit : En espérant que cette reformulation sera bonne, je vous souhaite une bonne journée.
Partager