Trigger : Oracle

Trigger : Oracle - SQL/NoSQL - Programmation

Marsh Posté le 12-11-2009 à 15:27:42    

bonjour, j'ai un petit soucis pour faire fonctionner mes trigger. A vrai dire, je n'arrive pasa comprendre le fonctionnement exacte du truc.
 
j'ai une table d'inscription d'eleves a des cours.
chaque cours a un nombre maximum accepté, et chaque eleve ne peut participer qu'a 3 cours.
Dans les procedures de remplissage des tables, ces conditions ont été verrifiées avec succes, et des exceptions générées sans souci.
 
maintenant il s'agit de tester ces meme conditions dans un trigger. et la je bloque
 

Citation :

create or replace trigger montrig
 
  before insert on participe
 
  for each row
 
  declare
 
   ideinscri number;
   idcinscri number;
   nombrecours number;
   nombreetu number;
   limiteeffectif NUMBER;
 
  BEGIN
 
    select idE into ideinscri from etudiant;  
    select idC into idcinscri from cours;
    select count(:old.idE) into nombrecours from participe where idE=ideinscri;
    select effectifmax into limiteeffectif from cours where idC=idcinscri;
    select count(:old.idC) into nombreetu from participe where idC=idcinscri;
 
    if (nombrecours>2) then
      if (nombreetu>=limiteeffectif) then
  raise_application_error(-20998,'Trop d etudiants sont deja inscrits a ce cours et cet etudiant a deja atteint le nombre maximum de cours.');
      else
 raise_application_error(-20998,'Trop d etudiants sont deja inscrits a ce cours');
      end if;
       raise_application_error(-20999,'cet etudiant a deja atteint le nombre maximum de cours');
       
    end if;
   
   
  END;
/


 
voici un exemple de ce que j'ai fait
la compilation se passe tres bien.
 
mais quand je lance la procédure qui doit remplir la table ou se font les test, cela me donne les erreurs suivantes :
 
 

Citation :

ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at "OPS$1GLUMANN.MONTRIG", line 10
ORA-04088: error during execution of trigger 'OPS$1GLUMANN.MONTRIG'
ORA-06512: at "OPS$1GLUMANN.INSCRIPTION", line 19
ORA-06512: at line 1



---------------

Reply

Marsh Posté le 12-11-2009 à 15:27:42   

Reply

Marsh Posté le 12-11-2009 à 15:30:48    

lumi a écrit :


  declare
 
   ideinscri number;
 
  BEGIN
 
    select idE into ideinscri from etudiant;  
 

Citation :

ERROR at line 1:
ORA-01422: exact fetch returns more than requested number of rows




 
t'as qu'une ligne dans chaque table?[:petrus dei]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-11-2009 à 15:31:56    

ben non c'est bien ca le probleme
 
mais je pensais que le "for each row" pouvais gerer ca


---------------

Reply

Marsh Posté le 12-11-2009 à 15:32:38    

j'aimerai que le trigger ne verrifie que la condition pour le cours et l'eleve concernés par l'action d'insertion.


---------------

Reply

Marsh Posté le 12-11-2009 à 15:35:35    

lumi a écrit :

ben non c'est bien ca le probleme

 

mais je pensais que le "for each row" pouvais gerer ca


et il est censé deviner tout seul quelle ligne de ta table retourner?[:autobot]
Cadeau : http://download.oracle.com/docs/cd [...] nsertedID5
http://download.oracle.com/docs/cd [...] m#g1041933


Message édité par skeye le 12-11-2009 à 15:36:12

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-11-2009 à 15:36:58    

ben comment faire pour le lui dire ?


Message édité par lumi le 12-11-2009 à 15:37:04

---------------

Reply

Marsh Posté le 12-11-2009 à 15:39:15    

a priori ton for each row n'a rien à foutre là, et tu as toutes les données dont tu as besoin pour faire les bonnes requêtes dans :NEW


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-11-2009 à 15:39:32    

2 minutes de recherche, et j'ai jamais codé un trigger de ma vie.


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 12-11-2009 à 15:44:38    

ORA-04082: NEW or OLD references not allowed in table level triggers


---------------

Reply

Marsh Posté le 12-11-2009 à 16:11:22    

pourquoi qq chose de ce style ne fonctionne pas ?
 
select count(:new.idE) into nombrecours from participe;
    select effectifmax into limiteeffectif from cours where idC=:new.idC;
    select count(:new.idC) into nombreetu from participe;


---------------

Reply

Marsh Posté le 12-11-2009 à 16:11:22   

Reply

Marsh Posté le 12-11-2009 à 16:23:07    

ou plutot ca :
 
select count(idE) into nombrecours from participe where idE=:new.idE;
    select effectifmax into limiteeffectif from cours where idC=:new.idC;
    select count(idC) into nombreetu from participe where idC=:new.idC;


---------------

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed