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 13/01/2008, 16h59   #1
Invité de passage
 
Inscription : janvier 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 2
Points : 0
Points : 0
Par défaut Probleme Trigger et curseur

Bonjour,

Je voudrai verifier sur ma base que les prenoms inseré dans ma table etudiant sont bien des prenom de garcons. Pour cela j'ai crée une table prenom contenant un dictionnaire de prenom de garcon. J'ai ensuite crée ce trigger qui se compile bien mais fait finalement l'inverse de ce que je veux:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE OR REPLACE TRIGGER TRIGG_PRENG
BEFORE INSERT OR UPDATE ON ETUDIANTS
FOR EACH ROW
declare cursor PREN_CUR IS
SELECT DISTINCT id,prenom FROM PRENOMS_GARCONS;
PREN etudiants.prenom%TYPE;
Id PRENOMS_GARCONS.id%TYPE;
erreur EXCEPTION;
begin
open PREN_CUR;
loop
fetch PREN_CUR INTO Id,PREN;
exit when PREN_CUR%NOTFOUND;
IF (:new.civ='Monsieur') OR (:new.civ='Mr') AND :new.PRENOM NOT LIKE PREN then
RAISE erreur;
end IF ;
end loop;
close PREN_CUR;
EXCEPTION
	WHEN erreur THEN
		RAISE_application_error(-20002,'Ce n est pas un prenom de garcon');
end;
/
Code :
INSERT INTO ETUDIANTS (NUMETUDIANT,CIV,NOM,PRENOM,TELFIXE,TELMOB,DNETUD,ADRNUM,ADRRUE,ADRCP,ADRVILLE) VALUES('E48','Mr','Clement','Clement','0157708080','0653777780','vendredi, octobre 16, 1987','105','Rue de Belleville', '75019','PARIS');
Cette insertion passe dans l'exception je ne vois pas pourquoi alors que le prenom Clement figure bien dans ma table prenom.

Merci pour vos reponses
snkyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/01/2008, 17h15   #2
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par snkyo Voir le message
IF (:new.civ='Monsieur') or (:new.civ='Mr') AND :new.PRENOM NOT LIKE PREN
Je n'ai pas regardé le reste attentivement mais ici il y deux points
- Pourquoi "not like"? "!=" suffirait normalement
- l'erreur par contre est la non utilisation de parenthèses!

Ce qui est écrit sera exécuté ainsi :
Code :
1
2
IF (:new.civ='Monsieur') or ( (:new.civ='Mr') AND :new.PRENOM NOT LIKE PREN )
Or je suppose que ce qui est attendu est ceci :
Code :
1
2
IF ( (:new.civ='Monsieur') or (:new.civ='Mr') ) AND :new.PRENOM NOT LIKE PREN
__________________
Consultant et formateur Oracle
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2008, 09h27   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
c'est pas plus simple de faire:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
CREATE OR REPLACE TRIGGER TRIGG_PRENG
BEFORE INSERT OR UPDATE ON ETUDIANTS
FOR EACH ROW
DECLARE
dummy INTEGER;
BEGIN
IF (:new.civ='Monsieur') OR (:new.civ='Mr') THEN
  SELECT 1
     INTO dummy
    FROM DUAL
  WHERE EXISTS (
           SELECT 1 
             FROM PRENOMS_GARCONS
           WHERE prenom = :new.PRENOM
                       );
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN 
RAISE_application_error(-20002,'Ce n est pas un prenom de garcon');
END;
/
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2008, 19h38   #4
Invité de passage
 
Inscription : janvier 2008
Messages : 2
Détails du profil
Informations forums :
Inscription : janvier 2008
Messages : 2
Points : 0
Points : 0
Merci beaucoup cette solution fonctionne parfaitement et est bien moins lourde

Bonne soirée
snkyo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 09h55   #5
Membre confirmé
 
Avatar de LBO72
 
Inscription : mai 2007
Messages : 385
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France

Informations forums :
Inscription : mai 2007
Messages : 385
Points : 282
Points : 282
La solution du grand Maitre OraFrance me convient très bien. Est-ce qu'on ne peut pas l'écrire comme suit :

Citation:
CREATE OR REPLACE TRIGGER TRIGG_PRENG
BEFORE INSERT OR UPDATE ON ETUDIANTS
FOR EACH ROW
DECLARE
dummy INTEGER;
BEGIN
IF (:new.civ='Monsieur' OR :new.civ='Mr') THEN
SELECT 1 INTO dummy
FROM PRENOMS_GARCONS
WHERE prenom = :new.PRENOM;
END IF;
EXCEPTION WHEN NO_DATA_FOUND THEN
RAISE_application_error(-20002,'Ce n est pas un prenom de garcon');
END;
/
Merci.
LBO72.
LBO72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 09h57   #6
Membre confirmé
 
Avatar de LBO72
 
Inscription : mai 2007
Messages : 385
Détails du profil
Informations personnelles :
Âge : 43
Localisation : France

Informations forums :
Inscription : mai 2007
Messages : 385
Points : 282
Points : 282
Je pense que ma solution ne fonctionnerait pas s'il y'a plusieurs même PRENOM

LBO72.
LBO72 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2008, 10h12   #7
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
en effet, d'où le EXISTS

mais tu peux aussi ajouter :

Code :
EXCEPTION WHEN NO_MANY_ROWS THEN NULL;
pour éviter de générer une erreur si le prénom est plusieurs fois présent... tu peux aussi ajouter un DISTINCT à ton SELECT mais çà impose un tri
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web