Il est bien crée dans le SGBD mais lorsque je tente d'update ma table il plante à l'exécution
- Code: Tout sélectionner
UPDATE Creneau
SET TENS='TDM'
WHERE idCren=1;
- Code: Tout sélectionner
create or replace TRIGGER VERIFFIRSTENSEIGN BEFORE INSERT OR UPDATE ON Creneau for each ROW
BEGIN
for c1_ligne in (select * from Creneau where DateC=(select min(DateC) from creneau)
and HDEB=(select min(HDEB) from creneau)
and IdCren=(select min(IdCren) from creneau)
and IdMat=:NEW.IdMat and IdGrp=:NEW.IdGrp) loop
if(c1_ligne.IdCren=:NEW.IdCren) then
DBMS_OUTPUT.PUT_LINE('Modification premier creneau' ||c1_ligne.IdCren);
if(:NEW.TENS='TDM') then
RAISE_APPLICATION_ERROR ( -20010, 'Creneau invalide' ) ;
end if;
end if;
if(:NEW.DateC <= c1_ligne.DateC) then
if(:NEW.HDEB <= c1_ligne.HDEB) then
if(:NEW.TENS='TDM') then
RAISE_APPLICATION_ERROR ( -20010, 'Creneau invalide' ) ;
end if;
end if;
end if;
end loop;
END;
/
L'erreur retourné exactement est la suivante
UPDATE Creneau
*
ERREUR à la ligne 1 :
ORA-04091: la table CRENEAU est en mutation ; le déclencheur ou la fonction ne peut la voir
ORA-06512: à "VERIFFIRSTENSEIGN", ligne 2
ORA-04088: erreur lors d'exécution du déclencheur 'VERIFFIRSTENSEIGN'
Je comprends ce que me dit l'erreur; je pense comprendre que le problème vient du fait que j'essaie de sélectionner des valeurs avec un curseur alors que la table est mutante.
Sauf que je ne vois pas quelle autre solution envisagé.
Pour simplifier mon créneau a un identifiant, une date, une heure, un groupe, un type (cours ou TDM), une matière.
Le but de ce déclencheur est de s'assurer que le premier créneau d'une matière est bien un cours.
Donc je suis forcement obligé de stocker les valeurs du premier cours afin de voir si son tens est un tdm ou non...
Du coup je vois pas comment faire ça sans généré d'erreur à l'exécution...une idée ?