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 04/03/2008, 11h44   #1
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 4
Points : 4
Par défaut Pb Trigger Oracle

Bonjour à tous,

Voila j'ai un petit problème avec un trigger :

Ce trigger s'applique sur ma table emprunt composé des champs suivants :
- NUM_ADHERENT : NUMBER
- DATE_EMPRUNT : NUMBER
- DATE_RETOUR : NUMBER

Je souhaite que mon trigger teste avant d'insérer une nouvelle ligne dans la base si le num_adherent n'est pas déjà présent 5 fois (En gros on ne doit pas avoir plus de 5 emprunts dans la base pour un même num_adhérent).

Voila mon trigger :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
CREATE OR REPLACE TRIGGER sumExemplaire before INSERT ON EMPRUNT
declare ligne_emprunt EMPRUNT%rowType;
begin
SELECT count(*),NUM_ADHERENT FROM EMPRUNT WHERE NUM_ADHERENT = (SELECT NUM_ADHERENT INTO ligne_emprunt FROM EMPRUNT) > 5;   
 
raise_application_error(-20001,'L adhérent à déjà 5 emprunt en cours');
 
exception
when no_data_found then NULL;
END;
Le message d'erreur

Code :
1
2
3
4
 
 
Warning: exécution terminée avec avertissement
TRIGGER sumExemplaire Compiled.
Merci d'avance
hel2013 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h01   #2
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 4
Points : 4
Par défaut Pb Syntaxe de trigger

Bonjour à tous,

Voila j'ai un petit problème avec un trigger :

Ce trigger s'applique sur ma table emprunt composé des champs suivants :
- NUM_ADHERENT : NUMBER
- DATE_EMPRUNT : NUMBER
- DATE_RETOUR : NUMBER

Je souhaite que mon trigger teste avant d'insérer une nouvelle ligne dans la base si le num_adherent n'est pas déjà présent 5 fois (En gros on ne doit pas avoir plus de 5 emprunts dans la base pour un même num_adhérent).

Voila mon trigger :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
CREATE OR REPLACE TRIGGER sumExemplaire before INSERT ON EMPRUNT
declare ligne_emprunt EMPRUNT%rowType;
begin
SELECT count(*),NUM_ADHERENT FROM EMPRUNT WHERE NUM_ADHERENT = (SELECT NUM_ADHERENT INTO ligne_emprunt FROM EMPRUNT) > 5;   
 
raise_application_error(-20001,'L adhérent à déjà 5 emprunt en cours');
 
exception
when no_data_found then NULL;
END;
Le message d'erreur

Code :
1
2
3
4
 
 
Warning: exécution terminée avec avertissement
TRIGGER sumExemplaire Compiled.
Merci d'avance
hel2013 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h09   #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
déjà avec un COUNT tu peux pas avoir de NO_DATA_FOUND donc l'exception est inutile. En plus, sans show err pour voir l'erreur tu risques pas de t'en sortir

Sinon un INTO dans une sous-requête ça risque pas de marcher
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h10   #4
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
Citation:
SELECT count(*),NUM_ADHERENT FROM EMPRUNT WHERE NUM_ADHERENT = (SELECT NUM_ADHERENT INTO ligne_emprunt FROM EMPRUNT) > 5;
t'as pas l'impression qu'il y a des opérandes en trop ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h20   #5
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 4
Points : 4
Merci pour ton aide, j'ai essayé d'une façon différente :

Code :
1
2
3
4
5
6
7
8
9
 
CREATE OR REPLACE TRIGGER sumExemplaire before INSERT ON EMPRUNT
declare ligne_emprunt EMPRUNT%rowType;
begin
SELECT NUM_ADHERENT FROM EMPRUNT GROUP BY NUM_ADHERENT HAVING count(*) > 5;   
 
raise_application_error(-20001,'L adhérent à déjà 5 emprunt en cours');
 
END;
Mais ça me met toujours une erreur que bien sûr je ne comprends pas :

Code :
1
2
3
 
 
3/1            PLS-00428: une clause INTO est attendue dans cette instruction SELECT
hel2013 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 12h57   #6
Membre émérite
 
Avatar de Mathusalem
 
Inscription : décembre 2003
Messages : 994
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 994
Points : 914
Points : 914
il ne manque pas un IF ?
Mathusalem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 13h56   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 320
Points : 5 839
Points : 5 839
Comme d'habitude on commence par les triggers en ignorant le SQL
Code :
1
2
3
...
SELECT count(*),NUM_ADHERENT FROM EMPRUNT WHERE NUM_ADHERENT = (SELECT NUM_ADHERENT INTO ligne_emprunt FROM EMPRUNT) > 5;   ...
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h12   #8
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
pas mal !

Bon, après y'aura forcement l'erreur MUTATING TABLE. Et là, ça va être dur de contourner.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/03/2008, 14h36   #9
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
merci d'éviter de créer 2 discussions sur le même sujet surtout pour un problème de syntaxe qu'une simple relecture du code et une bonne compréhension de l'erreur pourrait résoudre

Citation:
Envoyé par hel2013 Voir le message
Mais ça me met toujours une erreur que bien sûr je ne comprends pas :
Citation:
une clause INTO est attendue dans cette instruction SELECT
Ca te met pas sur la voie ça ? Lis donc la doc et regarde comment INTO est utilisé en PL/SQL
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 10h35   #10
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 4
Points : 4
Merci à tous pour votre aide !
hel2013 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 11h46   #11
Invité de passage
 
Inscription : novembre 2006
Messages : 13
Détails du profil
Informations forums :
Inscription : novembre 2006
Messages : 13
Points : 4
Points : 4
Pour ceux que ça interesse je poste la solution :

Code :
1
2
3
4
5
6
7
8
9
10
 
 
CREATE OR REPLACE TRIGGER sumExemplaire after INSERT OR UPDATE ON EMPRUNT
declare ligne_emprunt emprunt.NUM_ADHERENT%type;
begin
SELECT NUM_ADHERENT INTO ligne_emprunt FROM EMPRUNT GROUP BY NUM_ADHERENT HAVING count(*) > 5;   
raise_application_error(-20902,'L adhérent à déjà 5 emprunt en cours');
exception
when no_data_found then NULL;
END;
hel2013 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 12h18   #12
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 459
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 459
Points : 4 226
Points : 4 226
Et si 2 adhérents ont plus de 5 lignes, tu sortiras en TOO_MANY_ROWS
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 16h25   #13
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 975
Points : 3 975
Code :
raise_application_error(-20902,'L''adhérent a déjà 5 emprunts en cours.');
Corrige le message d'erreur, ça t'évitera l'ouverture d'un bug par le client...

Et une clause WHERE serait sûrement avantageux dans ta requète comme précisé ci-dessus.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2008, 16h39   #14
Membre Expert
 
Homme sébastien
Développeur informatique
Inscription : octobre 2006
Messages : 1 173
Détails du profil
Informations personnelles :
Nom : Homme sébastien
Âge : 29
Localisation : Argentine

Informations professionnelles :
Activité : Développeur informatique
Secteur : Finance

Informations forums :
Inscription : octobre 2006
Messages : 1 173
Points : 1 372
Points : 1 372
Envoyer un message via Skype™ à Vld44
et puis la gestion d'exceptions est inutile puisque dans un cas (when no data found) alors null mais dans les autres le fait que tu ne spécifies rien impliques null aussi ... il te manque in when others then raise ou quelque chose du genre.
Vld44 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 18h28.


 
 
 
 
Partenaires

Hébergement Web