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 :

Erreur ORA-21000 en PL/SQL pour un trigger


Sujet :

PL/SQL Oracle

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Erreur ORA-21000 en PL/SQL pour un trigger
    ORA-21000: l'argument numéro d'erreur utilisé pour raise_application_error de 1 est hors limites
    ORA-06512: à "LD5V.ANNULE_RESERVATION", ligne 20
    ORA-04088: erreur lors d'exécution du déclencheur 'LD5V.ANNULE_RESERVATION'
    Voici donc l'erreur que j'ai lorsque je veux updater ma table reservation, j'ai essayé plein de chiffres différents pour le raise application erreur, mais rien n'y fait...
    Voici le code de mon trigger :
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    CREATE OR REPLACE TRIGGER annule_reservation
    BEFORE UPDATE
    ON reservation
    FOR EACH ROW
     
    DECLARE
    	jourDepart		DATE ;
    	erreurDate 		EXCEPTION ;	
     
    BEGIN	
     
    	SELECT jour_depart INTO jourDepart		
    	FROM vol 
    	WHERE n_vol = :new.num_Vol_res ;
     
     
    	IF (( SYSDATE > jourDepart -2 ) AND ((:old.est_Confirme = 0) AND (:new.est_Confirme = 1)) )  	THEN		
     
    		raise erreurDate ;
     
    	END IF;	
     
    EXCEPTION	
    	WHEN erreurDate THEN
    		raise_application_error(-10000,'Il fallait confirme au moins 2 jours avant le depart.');		
    END;
    /


    Bon sinon, j'ai un autre problème lié à celui ci finalement. Lorsque mon trigger se déclenche, c'est bien il affiche un message d'erreur, mais ma table est qd même modifié. Comment dire au trigger qu'il ne faut pas qu'afficher mais carrément empêcher de continuer à la requête... Peut être avec raise application error, mais comme vous pouvez le constater, ça veut pas...

    Merci infiniment pour votre aide...

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Le premier message d'erreur est assez explicite: le premier argument de raise_application _error est incorrect. Il doit être entre -20000 et -20999:

    To call RAISE_APPLICATION_ERROR, use the syntax

    raise_application_error(
    error_number, message[, {TRUE | FALSE}]);

    where error_number is a negative integer in the range -20000 .. -20999
    Si l'UPDATE est quand même exécuté, c'est qu'ensuite un COMMIT est exécuté au lieu d'un ROLLBACK.
    Pour récupérer votre exception, le code appelant doit exécuter:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    EXCEPTION
    WHEN OTHERS THEN
    IF SQLCODE = <raise application error code>
    THEN
      ROLLBACK;
    END IF;

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 3
    Points
    3
    Par défaut OK !
    Merci beaucoup, je vais tester ça.
    Sinon est-il possible dans un trigger de faire un DELETE sur la ligne que l'on a en ligne de mire puisqu'elle a déclenché le trigger. Il me semble que j'ai eu une erreur de mutation je.sais.pu.quoi lorsque j'avais essayé ça.

    dans mon trigger juste après mon IF, j'avais essayé : voire premier msg
    DELETE FROM reservation r
    WHERE r.id_res= :old.id_res;

    et ça ne marchait pas !

    Donc savez vous comment supprimer la ligne qui nous embête ds un trigger ?
    Merci !

  4. #4
    Membre habitué Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Si tu veux supprimer une ligne de la table concernée par le déclencheur tu vas tomber dans le problème de la table mutante.

    Donc Oracle refuse cette suppression. Tu peux essayer une solution paliative :

    Il faut créer une table temporaire X , la structure de cette table contient juste les champs qui font l'identifiant de ta table "Reservation" par exemple .

    dans le déclancheur de la table reservation tu vas inserer la ligne que tu veux effacer dans la table temporaire X .
    Dans la table X , tu vas mettre un déclancheur sur l'évenement after insert, dans le traitement tu vas mettre un delete sur la table reservation avec une condition sur la clé que tu as stocké dans la table X.

    voilà , c'est une solution barbar , mais c'est ce qu'il faut faire pour eviter le problème de table mutante.

Discussions similaires

  1. Erreur ORA-01704 sql developer
    Par jerebenz dans le forum SQL
    Réponses: 19
    Dernier message: 04/03/2014, 14h45
  2. [Sql*Loader] Erreur ORA-00054
    Par Spyco dans le forum Oracle
    Réponses: 4
    Dernier message: 23/12/2005, 16h43
  3. [MySQL] Erreur sql pour inserer des checkbox
    Par digger dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/11/2005, 11h06
  4. [CE10 Pro] Erreur Connexion SQL pour etats publiés
    Par L.nico dans le forum Connectivité
    Réponses: 1
    Dernier message: 09/12/2004, 17h16
  5. [ODBC] erreur SQL pour les unions qui renvoient vide
    Par fabriceMerc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/11/2003, 11h06

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