Problème de table mutante !
Voila j'ai réalisé un trigger, mais lorsque je le teste et que j'essaie de modifier ou d'insérer un ligne dans ma table, j'ai un problème de table mutante que je n'arrive pas à résoudre.
Merci d'avance pour vos conseils avisés.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
create or replace trigger Charge_ens
after insert or update of duree on creneau
for each row
declare
charge number;
begin
select max(sum(duree)) into charge from creneau
group by noens;
if charge > 20 then
P_DEFICIT (:new.NOCLASSE, :new.NOMAT, :new.NOENS, :new.DUREE);
insert into TEMP_CRENEAU values (:new.NOCREN);
end if;
end;
/ |
Code:
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
|
create or replace procedure P_DEFICIT (v_noclasse in NUMBER, v_nomat in NUMBER, v_noens in NUMBER, v_duree in NUMBER) is
nbdef NUMBER;
dureemaj NUMBER;
begin
select count(*) into nbdef
from DEFICIT
where v_noclasse=noclasse
and v_nomat=nomat
and v_noens=noens;
if nbdef<>0 then
select nb_heures_total into dureemaj
from DEFICIT
where v_noclasse=noclasse
and v_nomat=nomat
and v_noens=noens;
dureemaj:=dureemaj+v_duree;
update DEFICIT
set nb_heures_total=dureemaj
where v_noclasse=noclasse
and v_nomat=nomat
and v_noens=noens;
else
insert into DEFICIT values (v_noclasse, v_nomat, v_noens, v_duree);
end if;
end;
/ |
Code:
1 2
|
update creneau set duree = 4 where nocren = 6; |
Code:
1 2 3 4 5 6 7 8
|
update creneau set duree = 4 where nocren = 6
*
ERROR at line 1:
ORA-04091: table M1SID44.CRENEAU is mutating, trigger/function may not see it
ORA-06512: at "M1SID44.CHARGE_ENS", line 4
ORA-04088: error during execution of trigger 'M1SID44.CHARGE_ENS' |
Quelques explications en anglais....
http://asktom.oracle.com/tkyte/Mutate/
Et n'oublie pas qu'un trigger est execute dans la meme trasaction que la table modifiee. Donc ton INSERT/UPDATE est toujours "en cours" quand le TRIGGER se lance.
En d'autres mots, tu ne peux pas faire de SELECT sur la table/champs que tu es en train de modifier (duree dans creneau). Il faut que tu trouves une autre astuce pour mettre de cote ta somme avant de faire l'insert.