Table en mutation PL/SQL

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Table en mutation PL/SQL

par Rockleader » 11 Avr 2015, 18:34

Je voudrais comprendre pourquoi le trigger que j'ai réalisé ne fonctionne pas.

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 ?
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 4 invités

cron

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite