IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Pb Trigger Oracle


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Points : 8
    Points
    8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    Warning: exécution terminée avec avertissement
    trigger sumExemplaire Compiled.
    Merci d'avance

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Points : 8
    Points
    8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    Warning: exécution terminée avec avertissement
    trigger sumExemplaire Compiled.
    Merci d'avance

  3. #3
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    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

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    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 ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci pour ton aide, j'ai essayé d'une façon différente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    3/1            PLS-00428: une clause INTO est attendue dans cette instruction SELECT

  6. #6
    Membre éprouvé Avatar de Mathusalem
    Profil pro
    IT moa
    Inscrit en
    Décembre 2003
    Messages
    1 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : IT moa

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 008
    Points : 1 067
    Points
    1 067
    Par défaut
    il ne manque pas un IF ?

  7. #7
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Comme d'habitude on commence par les triggers en ignorant le SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    SELECT count(*),NUM_ADHERENT FROM EMPRUNT WHERE NUM_ADHERENT = (SELECT NUM_ADHERENT INTO ligne_emprunt FROM EMPRUNT) > 5;   ...

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    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 :
    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

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Merci à tous pour votre aide !

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Pour ceux que ça interesse je poste la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  12. #12
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Et si 2 adhérents ont plus de 5 lignes, tu sortiras en TOO_MANY_ROWS
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  13. #13
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Argentine

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [pl/sql] probleme trigger oracle
    Par john123 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/12/2007, 19h27
  2. [PL/SQL - Trigger Oracle] Données non retournées
    Par Hug0_76 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/02/2007, 23h12
  3. Probleme Trigger Oracle 9i
    Par Strit83 dans le forum PL/SQL
    Réponses: 5
    Dernier message: 27/11/2006, 14h24
  4. Erreur trigger oracle
    Par djsbens dans le forum Oracle
    Réponses: 7
    Dernier message: 22/02/2006, 13h37
  5. [JDBC]Probleme avec trigger Oracle
    Par aurel89 dans le forum JDBC
    Réponses: 2
    Dernier message: 02/08/2005, 11h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo