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 et raise_application_error : comment forcer le "plantage" ?


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Trigger et raise_application_error : comment forcer le "plantage" ?
    Bonjour,

    Je travaille avec un ERP.
    Je n'ai pas la source du programme, et il ne peut pas être modifié.
    => Je ne sais donc pas comment il gère les erreurs, et il m'est impossible d'obtenir l'information ou une modification à ce niveau.

    Il manque un contrôle lors d'une modification dans la base.

    La garantie que j'ai, c'est que tous les traitements de l'ERP sont transactionnels, et le fait de planter durant une requête provoquera un rollback de l'intégralité du traitement.

    Voici 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
     
    create or replace
    TRIGGER wtrig_esk
    -------------------------------------------------------------------------------
    --      Trigger : wtrig_esk
    --      Fichier : ap$triggers:wtrig_esk.sql
    --      Lorsque code emplacement vide et NEW.C01 < 0, alors provoquer
    --      une exception.
    -------------------------------------------------------------------------------
    --      Auteur    : S.Devidal
    --      Version   |Date         |Auteur  |Objet
    -------------------------------------------------------------------------------
    --      V.1       |08/02/2012   |DES     |Création du trigger
    -------------------------------------------------------------------------------
    BEFORE UPDATE
    ON esk
    FOR EACH ROW
    WHEN (NEW.codsoc = 218 and NEW.codemp = ' ' AND NEW.c01 < 0)
    DECLARE
      bidon integer;
    BEGIN
       raise_application_error(-20001, 'Pas dispo dans l''emplacement générique (' || to_char(:OLD.c01) || ')');
       bidon := 1/0;
    END;
    Sans la variable "bidon", aucun problème depuis SQL Developpeur. Un update sur ESK qui entre dans le test du trigger provoque bel et bien une erreur, et la mise à jour échoue.

    En revanche, depuis l'ERP, aucune erreur n'est levée, et l'instruction passe bien.

    J'ai donc été obligé de rajouter la variable "bidon" afin de faire une division par 0, et planter pour de bon.

    Ca marche, l'ERP détecte l'erreur, et aucune mise à jour n'est faite.

    Sauf que plus crade, tu meurs.

    Avec SQL Server, je sais que selon les numéros d'erreurs et autres paramètres passés au RAISEERROR, on peut produire différents niveaux d'erreur (du simple message informatif à la destruction immédiate de la connexion).

    Est-ce qu'avec Oracle, je peux reproduire ça ? Lorsque je fait mon raise_application_error, je souhaite que le programme s'arrête immédiatement, exactement comme lorsqu'on fait une division par 0.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 955
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 955
    Par défaut
    Ou essaie avec d'autres numéros d'erreur, peut être que -20001 (le plus classique) est déjà catché par l'ERP.
    La section de gestion des erreurs
    DBMS_STANDARD.raise_application_error(numero_erreur, message[, {TRUE | FALSE}])

    numero_erreur représente un entier négatif compris entre -20000 et -20999
    message représente le texte du message d'une longueur maximum de 2048 octets
    TRUE indique que l'erreur est ajoutée à la pile des erreurs précedentes
    FALSE indique que l'erreur remplace toutes les erreurs précédentes

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Ou déclare ta propre execption dans ton trigger
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXC_MON_ERREUR_A_MOI  EXCEPTION;
    Puis tu l'appelles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RAISE EXC_MON_ERREUR_A_MOI;
    Ce serait étonnant que l'ERP puisse l'intercepter

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/11/2007, 13h31
  2. [FORMs 6 ] comment forcer un trigger
    Par sdiack dans le forum Oracle
    Réponses: 10
    Dernier message: 13/02/2006, 11h07
  3. [Struts]comment forcer un Forward ?
    Par njac dans le forum Struts 1
    Réponses: 4
    Dernier message: 13/10/2004, 16h02

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