Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/01/2008, 18h27   #1
Invité de passage
 
Inscription : juillet 2005
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 2
Points : 1
Points : 1
Envoyer un message via AIM à fayerne Envoyer un message via MSN à fayerne Envoyer un message via Yahoo à fayerne
Par défaut Problème avec un trigger

Bonjour à tous,
dans le cadre d'un projet d'étude, je dois écrire un trigger qui verifie avant l'insertion de données dans ma table si les données fournit sont correctes:

j'ai d'une part une table pays(id,nom,agemajorite) et d'autre part une table compte(id,pseudo,...,idpays);

Or je ne dois pouvoir enregistré que les utilisateurs majeurs. C'est pourquoi je souhaite écrire un trigger qui verifie l'age en fonction de la date de naissance et de l'age de majorite du pays concerné. Voila mon trigger :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE OR REPLACE TRIGGER trigger_majorite
BEFORE INSERT ON COMPTE
FOR EACH ROW                                                      
DECLARE
majorite INTEGER;
datenaiss DATE;
BEGIN
SELECT pays.ageMajorite INTO majorite FROM pays,compte WHERE pays.id=(SELECT compte.idpays FROM compte) AND pays.id=compte.idpays ;
SELECT compte.dateNaissance INTO datenaiss FROM compte ;
majorite := majorite*12 ;
IF (ADD_MONTHS (datenaiss, majorite) > sysdate)
THEN dbms_output.put_line( 'Utilisateur non majeur !') ;
END IF ;
END ;
/
Le trigger se crée bien mais leve une erreur lors de l'exécution :

Citation:
*
ERREUR Ó la ligne 1 :
ORA-01427: sous-interrogation ramenant un enregistrement de plus d'une ligne
ORA-06512: Ó "YOHANN.TRIGGER_MAJORITE", ligne 5
ORA-04088: erreur lors d'exÚcution du dÚclencheur 'YOHANN.TRIGGER_MAJORITE'
Je pense qu'il me manque une clause WHERE dans mes requetes mais cela reste très sombre.

Pouvez vous m'aider SVP ?

d'avance merci
fayerne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2008, 22h45   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Dans un trigger, un select sur la même table provoque l'erreur de la table mutante (ora-04091).
Voici un lien qui parle du problème de la table mutante (ora-04091)
http://sgbd.developpez.com/oracle/ora-04091/
Essaie ce code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
CREATE OR REPLACE TRIGGER trigger_majorite
BEFORE INSERT ON COMPTE
FOR EACH ROW 
DECLARE
majorite INTEGER;
BEGIN
SELECT pays.ageMajorite INTO majorite FROM pays WHERE pays.id=:new.idpays   ;
majorite := majorite*12 ;
IF (ADD_MONTHS (:new.datenaiss, majorite) > sysdate)
THEN 
RAISE_APPLICATION_ERROR(-20000, 'Utilisateur non majeur !') ;
END IF ;
END ;
/
Remarque : on ne peut pas utiliser = quand une sous-requette ramène plusieurs enregistrements, on peut utliser à la place un exists
exemple

Code :
1
2
3
select * 
from emp 
where exists( select 1 from dept where emp.deptno=dept.deptno)
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2008, 00h36   #3
Invité de passage
 
Inscription : juillet 2005
Messages : 2
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 2
Points : 1
Points : 1
Envoyer un message via AIM à fayerne Envoyer un message via MSN à fayerne Envoyer un message via Yahoo à fayerne
Merci, ca marche parfaitement bien maintenant ! merci Beaucoup !
fayerne est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h00.


 
 
 
 
Partenaires

Hébergement Web