Trigger - ORA-04091 Table mutante
Fermé
lemega
Messages postés
85
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 40591 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 décembre 2024 - 12 juil. 2012 à 18:47
jee pee Messages postés 40591 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 24 décembre 2024 - 12 juil. 2012 à 18:47
A voir également:
- Trigger - ORA-04091 Table mutante
- Ora-00001: violation de contrainte unique - Forum Programmation
- Ora-12514 - Forum Programmation
- Ora-06502 ✓ - Forum Oracle
- Ora-00904 identificateur non valide ✓ - Forum Oracle
- Ora-12560: tns : erreur d'adaptateur de protocole ✓ - Forum Oracle
3 réponses
jee pee
Messages postés
40591
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
24 décembre 2024
9 462
Modifié par jee pee le 12/07/2012 à 14:31
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é.
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é.
lemega
Messages postés
85
Date d'inscription
mardi 13 janvier 2009
Statut
Membre
Dernière intervention
31 mai 2023
7
12 juil. 2012 à 16:10
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
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
jee pee
Messages postés
40591
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
24 décembre 2024
9 462
12 juil. 2012 à 18:47
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.
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.