Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/11/2011, 09h32   #1
Invité de passage
 
Inscription : octobre 2005
Messages : 14
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Seine et Marne (Île de France)

Informations forums :
Inscription : octobre 2005
Messages : 14
Points : 1
Points : 1
Envoyer un message via MSN à asirier
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 :
Citation:
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 :
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.
asirier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/11/2011, 10h55   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 313
Points : 5 817
Points : 5 817
On peut voir un exemple très simplifié mais complet de ce que vous faite: déclarations des variable, traitement, exceptions…
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 07h44   #3
Invité de passage
 
Inscription : octobre 2005
Messages : 14
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Seine et Marne (Île de France)

Informations forums :
Inscription : octobre 2005
Messages : 14
Points : 1
Points : 1
Envoyer un message via MSN à asirier
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 :
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
asirier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 09h32   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 313
Points : 5 817
Points : 5 817
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/11/2011, 16h09   #5
Invité de passage
 
Inscription : octobre 2005
Messages : 14
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Seine et Marne (Île de France)

Informations forums :
Inscription : octobre 2005
Messages : 14
Points : 1
Points : 1
Envoyer un message via MSN à asirier
Vous pouvez developper un peu ou par un exemple si possible ...

Merci d'avance.
asirier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 17h37   #6
Membre du Club
 
Homme Arnaud
Inscription : octobre 2002
Messages : 56
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 32
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2002
Messages : 56
Points : 66
Points : 66
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.
__________________
Tuning and optimization are not a fix to a bad design. A good design is a fix to a bad design.
Dajon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2011, 11h51   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 313
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 313
Points : 5 817
Points : 5 817
Oui, c'est ça
Code :
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>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/12/2011, 08h43   #8
Invité de passage
 
Inscription : octobre 2005
Messages : 14
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Seine et Marne (Île de France)

Informations forums :
Inscription : octobre 2005
Messages : 14
Points : 1
Points : 1
Envoyer un message via MSN à asirier
Super merci !!

Je savais pas que j'avais le droit de faire ca !!!
C'est une super astuce qui va résoudre mon problème !!!

Encore merci
Bonne journée
Annie
asirier est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 09h31   #9
Invité de passage
 
Inscription : octobre 2005
Messages : 14
Détails du profil
Informations personnelles :
Âge : 37
Localisation : France, Seine et Marne (Île de France)

Informations forums :
Inscription : octobre 2005
Messages : 14
Points : 1
Points : 1
Envoyer un message via MSN à asirier
Malheureusement,

Après modification du script, j'ai toujours le même problème comme si les 3 erreurs que j'essai de détecter était hors du champ du PRAGMA UNIT !!

Je sèche !!!
asirier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h52.


 
 
 
 
Partenaires

Hébergement Web