Trigger - ORA-04091 Table mutante

Fermé
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 - Modifié par lemega le 12/07/2012 à 13:14
jee pee Messages postés 39636 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 - 12 juil. 2012 à 18:47
Bonjour à tous,
j'ai une table EMP(empno, ename, job, salaire)
Voici l'ennoncé :
On suppose qu'au sein de l'entreprise chaque fois qu'un employ'e change de travail on lui accorde une augmentation de salaire d'un montant de 100 euros.
Cr'eer le trigger change job qui r'ealise ceci pour tout n uplet concern'e avant la modi?cation de travail.

voici le trigger ke j'ai ecrit:
CREATE TRIGGER change_job
BEFORE UPDATE OF job ON Emp
FOR EACH ROW
DECLARE
v_empno Emp.empno%TYPE;
v_ename Emp.ename%TYPE;
v_job Emp.job%TYPE;
v_sal Emp.sal%TYPE;
tab_mut EXCEPTION;
PRAGMA EXCEPTION_INIT(tab_mut, -04091);
BEGIN
UPDATE Emp SET sal = sal + 100 WHERE job = :NEW.job;
EXCEPTION
WHEN tab_mut THEN
DBMS_OUTPUT.PUT_LINE('Fausse alerte');

END ;
/

Mais à l'execution du trigger l'erreur ORA-04091 s'affriche m'indiquant que la table EMP est une table mutante...Et donc j'ai ecrit celui-ci:

SET SERVEROUTPUT ON;
CREATE TRIGGER change_job
BEFORE UPDATE OF job ON Emp
FOR EACH ROW
DECLARE
tab_mut EXCEPTION;
PRAGMA EXCEPTION_INIT(tab_mut, -04091);
BEGIN
UPDATE Emp SET sal = sal + 100 WHERE job = :NEW.job;
EXCEPTION
WHEN tab_mut THEN
DBMS_OUTPUT.PUT_LINE('Fausse alerte');

END ;
/

Mais je constate qu'à l'execution le salaire n'est pas modifié...

Alors je me tourne vers vous pour m'aider à trouver une solution à ce problème.

Merci.....

3 réponses

jee pee Messages postés 39636 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié par jee pee le 12/07/2012 à 14:31
Salut,

Si quand dans un traitement tu as un message d'anomalie, tu modifies le traitement pour cacher le message d'anomalie, c'est sûr que y a plus d'erreur, mais il n'y a aucune raison qu'il fasse le traitement ;-)))))

Il faut que tu retravailles ta logique.

Je ne vois nul part que tu traites l'intitulé du problème : quand un employé change de job.

cdlt

Un étranger, c'est un ami qu'on n'a pas encore rencontré.
0
lemega Messages postés 87 Date d'inscription mardi 13 janvier 2009 Statut Membre Dernière intervention 31 mai 2023 7
12 juil. 2012 à 16:10
Merci pour votre reponse...
ici l'employé change de job par un UPDATE comme ceci :
UPDATE Emp set job='Directeur' WHERE empno=7499 ;
et le trigger devrait modifier le salaire de cet employé...comme ceci:
SET SERVEROUTPUT ON;
CREATE TRIGGER change_job
BEFORE UPDATE OF job ON Emp
FOR EACH ROW
DECLARE
v_sal Emp.sal%TYPE;
v_job Emp.job%TYPE;
tab_mut EXCEPTION;
PRAGMA EXCEPTION_INIT(tab_mut, -04091);
BEGIN
SELECT sal, job INTO v_sal, v_job FROM Emp WHERE job = :NEW.job;
UPDATE Emp SET sal = sal + 100 WHERE job = :NEW.job;
EXCEPTION
WHEN tab_mut THEN
DBMS_OUTPUT.PUT_LINE('Fausse alerte');

END ;
/

mais je suis toujours confronté au même problème...
Merci
0
jee pee Messages postés 39636 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
12 juil. 2012 à 18:47
Je pense qu'il faut que tu révises la notion d'identifiant sur une base de donnée.

Ici l'identifiant de la table emp c'est empno, pas le job. Mais c'est une autre histoire car tu ne devrais pas avoir à l'utiliser.

Après si dans un trigger before update sur emp tu déclenches toi en plus un update sur la même table à l'intérieur du trigger ça risque de boucler (ça doit être ça le problème de table mutante).

Pour moi dans le trigger tu devrais juste jouer sur les champs :OLD.xx :NEW.xx et ne faire ni select ni update.

0