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 :

Trigger "no data found"


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Février 2007
    Messages
    96
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 96
    Points : 62
    Points
    62
    Par défaut Trigger "no data found"
    Bonjour à tous,

    j'ai un petit souci avec un trigger qui doit normalement interdire l'ajout, la modification et la suppression d'un trajet (je travaille sur une base TRAIN) dont la date est inférieure à la date système.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    create or replace
    TRIGGER TRIGGER_DATE_TRAJET BEFORE INSERT OR UPDATE OR DELETE ON TRAJET 
    FOR EACH ROW 
    declare 
      datedepart date;
      ExDateInf Exception;
    begin 
      select JOUR into datedepart from trajet where numtrajet = :new.numtrajet;
    if datedepart<sysdate then 
      raise ExDateInf; 
    end if;
     
      Exception
      when ExDateInf then
      raise_application_error(-20005,'Impossible car la date du trajet est inférieure à la date du jour');
    end;
    Aucun problème de compilation, mais à l'insert d'un enregistrement j'ai les erreurs suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Error report:
    SQL Error: ORA-01403: aucune donnée trouvée
    ORA-06512: à "PERCEUSEKILLER.TRIGGER_DATE_TRAJET", ligne 5
    ORA-04088: erreur lors d'exécution du déclencheur 'PERCEUSEKILLER.TRIGGER_DATE_TRAJET'
    01403. 00000 -  "no data found"
    Cela viendrait-il du if datedepart<sysdate then ?

    Merci par avance pour vos conseils.

  2. #2
    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
    Non, ça vient du SELECT !

    En plus un SELECT sur la table du trigger est interdite.

    Autant utiliser les :new et :old
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Février 2007
    Messages
    96
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 96
    Points : 62
    Points
    62
    Par défaut
    Tout d'abord, merci pour ta disponibilité McM.

    J'ai finalement réussi avec l'aide d'un collègue, qui m'a donné les mêmes infos que toi.

    J'ai séparé d'un côté le trigger INSERT (:new.jour) et de l'autre le trigger UPDATE OR DELETE (:old.jour).

    Merci encore et bonne journée.

    Cordialement.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Un trigger au lieu de deux
    Tu peux ne faire qu'un trigger au lieu de deux. Après tu conditionnes sur le cas de figure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    IF INSERTING THEN
     
    --utilisation de ton :new.date
     
    ELSE
     
    -- utilisation de ton :old.date
     
    END IF;
    En passant :
    • quel est l'utilité du test sur le delete ?
    • pourquoi le :old dans le cas de l'update ?

  5. #5
    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
    Ben le old en cas d'update parce qu'il ne veut pas modifier si l'ancienne valeur est dépassée.

    un trigger qui doit normalement interdire l'ajout, la modification et la suppression d'un trajet [...] dont la date est inférieure à la date système.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. Insertion (no data found) trigger
    Par dianroca dans le forum Oracle
    Réponses: 2
    Dernier message: 21/02/2012, 10h19
  2. Réponses: 3
    Dernier message: 13/07/2006, 10h40

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