Trigger : Oracle - SQL/NoSQL - Programmation
Marsh Posté le 12-11-2009 à 15:30:48
lumi a écrit :
|
t'as qu'une ligne dans chaque table?
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
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.
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?
Cadeau : http://download.oracle.com/docs/cd [...] nsertedID5
http://download.oracle.com/docs/cd [...] m#g1041933
Marsh Posté le 12-11-2009 à 15:36:58
ben comment faire pour le lui dire ?
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
Marsh Posté le 12-11-2009 à 15:39:32
2 minutes de recherche, et j'ai jamais codé un trigger de ma vie.
Marsh Posté le 12-11-2009 à 15:44:38
ORA-04082: NEW or OLD references not allowed in table level triggers
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;
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;
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
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 :
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
---------------