Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1647 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Trigger : Oracle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Trigger : Oracle

n°1940060
lumi
Posté le 12-11-2009 à 15:27:42  profilanswer
 

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



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

mood
Publicité
Posté le 12-11-2009 à 15:27:42  profilanswer
 

n°1940061
skeye
Posté le 12-11-2009 à 15:30:48  profilanswer
 

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 -
n°1940062
lumi
Posté le 12-11-2009 à 15:31:56  profilanswer
 

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


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

n°1940063
lumi
Posté le 12-11-2009 à 15:32:38  profilanswer
 

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


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

n°1940064
skeye
Posté le 12-11-2009 à 15:35:35  profilanswer
 

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 -
n°1940065
lumi
Posté le 12-11-2009 à 15:36:58  profilanswer
 

ben comment faire pour le lui dire ?


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

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

n°1940066
skeye
Posté le 12-11-2009 à 15:39:15  profilanswer
 

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 -
n°1940067
skeye
Posté le 12-11-2009 à 15:39:32  profilanswer
 

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


---------------
Can't buy what I want because it's free -
n°1940069
lumi
Posté le 12-11-2009 à 15:44:38  profilanswer
 

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


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

n°1940079
lumi
Posté le 12-11-2009 à 16:11:22  profilanswer
 

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;


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

mood
Publicité
Posté le 12-11-2009 à 16:11:22  profilanswer
 

n°1940086
lumi
Posté le 12-11-2009 à 16:23:07  profilanswer
 

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;


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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Trigger : Oracle

 

Sujets relatifs
[Oracle] Problème trigger auto increment[ORACLE - TRIGGER]exception TABLE IS MUTATING
pbm avec trigger avec fonction pour replication sur oracle[SQL,ORACLE]Message d'erreur mutating, trigger....(RESOLU)
SQL Oracle : trigger pour récupérer le current user[resoluTRIGGER REPLICATION] replication de table sur deux bases repar
[Oracle] Désactiver un trigger pendant un UPDATE[oracle/pl/sql] problème trigger
[oracle] pb trigger pl/sql[ORACLE] Trigger renvoyant un simple Warning
Plus de sujets relatifs à : Trigger : Oracle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR