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 :

Gestion des erreurs avec PRAGMA EXCEPTION_INIT


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Par défaut Gestion des erreurs avec PRAGMA EXCEPTION_INIT
    Bonjour,

    J'ai un soucis avec la gestion des erreurs.

    Lors de l'exécution de mon PLSQL j'ai les erreurs suivantes :
    ERREUR à la ligne 85 :
    ORA-04052: erreurs lors de la consultation de l'objet distant
    ORA-00604: une erreur s'est produite au niveau SQL récursif 1
    ORA-12170: TNS : délai de connexion dépassé
    => Pour info dans mon traitement j'essai d'accéder à une table via un DB_LINK mais pas de bol cette base est hors ligne donc j'aimerais pouvoir gérer l'exeption.

    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
    17
    pb_obj_distant EXCEPTION;
    PRAGMA EXCEPTION_INIT(pb_obj_distant, -04052);
     
    pb_sql_recursif EXCEPTION;
    PRAGMA EXCEPTION_INIT(pb_sql_recursif ,-04052);
     
    pb_delai_depasse EXCEPTION;
    PRAGMA EXCEPTION_INIT(pb_delai_depasse , -12170);
     
    .......
     
    WHEN unit_error THEN
        dbms_output.put_line('Pas d''accès!');
    WHEN pb_sql_recursif THEN
        dbms_output.put_line('pb_sql_recursif ');
    WHEN pb_delai_depasse THEN
        dbms_output.put_line('pb_delai_depasse ');
    Le soucis c'est que ca rentre jamais dans les exceptions !!
    Et j'ai les message "système" sans les dbms dans la log.

    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé 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
    Par défaut
    On peut voir un exemple très simplifié mais complet de ce que vous faite: déclarations des variable, traitement, exceptions…

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Par défaut
    Bonjour et merci d'essayer de m'aideR.

    Voici le code très simplifié.

    J'ai bien l'impression que le problème vient du fait que l'erreur se produit sur la partie déclaration de variable et que du coup, la gestion des erreurs n’étant pas encore initialisée, le PL renvoie une erreur brut de pomme.

    En fait l'erreur est générée sur le curseur tapant sur la base distante (db_link).
    Y a-t-il un moyen de contourner ? y a-t-il une gestion spéciale ?

    Un grand merci d'avance pour l'aide !

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    alter session set nls_date_format = 'dd/mm/yyyy';
     
    DECLARE
     
    pb_delai_depasse EXCEPTION;
    PRAGMA EXCEPTION_INIT(pb_delai_depasse , -12170);
     
     
     
    cursor c_table (jour date) is
    select 
       c1,c2,c3....,c4
    from 
                table@base_distante
    where 
                jour = p_date ;
     
     
    BEGIN 
     
    dbms_output.put_line('debut');
     
    .....
     
    dbms_output.put_line('fin');
     
     
    EXCEPTION
      WHEN utl_file.invalid_path THEN
        dbms_output.put_line('Chemin invalide');
     
     ...
     
     
    WHEN pb_delai_depasse THEN
        dbms_output.put_line('pb_delai_depasse ');
     
        WHEN OTHERS THEN   
        dbms_output.put_line('Autres : '||SQLERRM);
    END;
    /
    exit

  4. #4
    Expert confirmé 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
    Par défaut
    Oui c’est ça : les exceptions qui sont levées dans les déclarations d’un block PL/SQL se propagent toute suite au block ou l’environnement appelant et ne peuvent pas être interceptées par la section de traitement des exceptions du ce même block. Par contre un block appelant pourrait les intercepter.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 73
    Par défaut
    Vous pouvez developper un peu ou par un exemple si possible ...

    Merci d'avance.

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 58
    Par défaut
    Bonsoir,

    Si j'ai bien compris ce que veut dire mnitu:

    L'exception est levée dans la partie DECLARE de ton bloc. Le problème et que la gestion des exceptions ne gère que les exceptions levées entre le BEGIN et le END du bloc correspondant.

    Par contre, si tu encapsulais cela dans un autre bloc, alors tu pourrais récupérer l'exception.

    Par exemple, créer une procédure P1, qui gère la fameuse exception, et qui appelle une procédure P2 qui exécute ton code.

  7. #7
    Expert confirmé 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
    Par défaut
    Oui, c'est ça
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 
    Connected as impdata
     
    SQL> set serveroutput on
    SQL> 
    SQL> Declare
      2    l_var varchar2(2) := 100; -- lève l'exception VALUE_ERROR
      3  Begin
      4    Dbms_Output.put_line(l_var);
      5  Exception
      6    When VALUE_ERROR Then -- jamais intercepté
      7      Dbms_Output.put_line('Erreur de valorisation de la variable l_var');
      8  End;
      9  /
     
    Declare
      l_var varchar2(2) := 100; -- lève l'exception VALUE_ERROR
    Begin
      Dbms_Output.put_line(l_var);
    Exception
      When VALUE_ERROR Then -- jamais intercepté
        Dbms_Output.put_line('Erreur de valorisation de la variable l_var');
    End;
     
    ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur: tampon de chaîne de caractères trop petit
    ORA-06512: à ligne 3
    SQL> Begin
      2    Declare
      3      l_var varchar2(2) := 100; -- lève l'exception VALUE_ERROR mais dans un bloc imbriqué
      4    Begin
      5      Dbms_Output.put_line(l_var);
      6    End;
      7  Exception
      8    When VALUE_ERROR Then -- intercepté l'exception
      9      Dbms_Output.put_line('Erreur de valorisation de la variable l_var');
     10  End;
     11  /
     
    Erreur de valorisation de la variable l_var
     
    PL/SQL procedure successfully completed
     
    SQL>

Discussions similaires

  1. Gestion des erreur avec aspSmartUpload
    Par zooffy dans le forum ASP
    Réponses: 2
    Dernier message: 07/12/2007, 09h39
  2. gestion des erreurs avec fichier .properties
    Par _momo dans le forum Struts 1
    Réponses: 2
    Dernier message: 20/08/2007, 14h05
  3. [J2EE/JSP] Gestion des erreurs avec une base SQL server 2005
    Par critok dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 30/04/2006, 16h57
  4. Gestion des erreurs avec setjump/longjump
    Par gege2061 dans le forum C
    Réponses: 1
    Dernier message: 05/02/2006, 15h51

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