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 03/02/2011, 17h15   #1
Membre confirmé
 
Inscription : décembre 2002
Messages : 450
Détails du profil
Informations forums :
Inscription : décembre 2002
Messages : 450
Points : 265
Points : 265
Par défaut Jeter une exception d'une procédure au bloc anonyme appelant ?

Hello tout le monde,


J'ai un bloc anonyme dans un fichier .SQL appelé par SQL*Plus:
Code :
1
2
3
4
begin
@ma_procedure;
end;
/
Je souhaiterai jeter une exception de la procédure ma_procedure et l'intercepter dans le bloc anonyme.

Avec deux procédures stockées dans un même package et l'exception déclarée dans l'entête, les deux procédures reconnaissent l'exception commune, comme on peut le voir ici :
http://www.adp-gmbh.ch/ora/plsql/exception.html

J'ai testé à tout hasard :
Code :
1
2
3
4
5
6
7
8
9
10
CREATE OR REPLACE PROCEDURE ma_procedure IS
    CODE_RETOUR_EXCEPTION EXCEPTION;
BEGIN
    raise CODE_RETOUR_EXCEPTION;
EXCEPTION 
    when CODE_RETOUR_EXCEPTION then
         DBMS_OUTPUT.PUT_LINE ('code retour 1');
   when OTHERS then
         raise;
END;
Puis ai appelé la procédure avec mon bloc anonyme :
Code :
1
2
3
4
5
6
7
8
9
10
DECLARE
    CODE_RETOUR_EXCEPTION EXCEPTION;
BEGIN
@ma_procedure;
EXCEPTION
   when CODE_RETOUR_EXCEPTION then
         DBMS_OUTPUT.PUT_LINE ('code retour 2');          
   when OTHERS then
         DBMS_OUTPUT.PUT_LINE ('code retour 3');
end;
Mais bien sûr, donc mon bloc anonyme, je ne tombe pas dans les exceptions.
Ce qui est normal car l'exception CODE_RETOUR_EXCEPTION n'est pas commune au bloc anonyme et à la procédure stockée

Dans ce cas, comment faire pour jeter l'exception d'une procédure à un bloc anonyme ?
weed est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 17h52   #2
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
Par défaut Déclarer les exceptions communes dans un package

Salut,

Tu peux déclarer tes exceptions communes dans un package et les utiliser dans une procédure ou un bloc anonyme.

Etape 1: Déclarer les exceptions
Code :
1
2
3
4
5
6
 
CREATE OR REPLACE Package zpoz_exc AS
 
  exc_1 Exception;
End;
/
Etape 2: Lever l'exception dans une procédure
Code :
1
2
3
4
5
6
7
8
9
10
 
CREATE OR REPLACE Procedure zpoz_exc_prc AS
Begin
  Raise zpoz_exc.exc_1;
-- On pourrait aussi bien ne pas mettre de clause exception dans ce cas
Exception
  When Others Then
    Raise;
End;
/
Etape 3 : Utilisation depuis un bloc PlSql anonyme
Code :
1
2
3
4
5
6
7
8
9
10
 
Begin
  zmbo_exc_prc;
Exception
  When zpoz_exc.exc_1 Then
    dbms_output.put_line('exc_1');
  When Others Then
    dbms_output.put_line('other');
End;
/
Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2011, 18h41   #3
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 808
Points : 5 808
Utilisez Raise_Application_Error.
Par ailleurs ce code
Code :
1
2
3
4
5
 
...
Exception
  When Others Then
    Raise;
ne sert strictement à rien à part de vous discréditer dans un interview professionnel. AskTom.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 03/02/2011, 19h53   #4
Membre actif
 
Inscription : février 2007
Messages : 167
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 167
Points : 161
Points : 161
Il faut lire le commentaire dans le code.

Code :
1
2
 
-- On pourrait aussi bien ne pas mettre de clause exception dans ce cas
La clause exception est là pour être complétée à l'image de l'exemple de départ donné par weed.

A part ça :
Le raise_application_error demande un numéro d'exception. On a accès à la tranche -20000 à -20999. On peut se repasser l'exception d'un programme à l'appelant si on se définit une nomenclature des erreurs en fonction des numéros. Avec 1000 exceptions différentes il y a de quoi faire. MAIS il faut savoir à quoi correspond la -20001, la -20002 etc... ET ne pas réutiliser les numéros à tord et à travers dans les programmes.

Si l'idée est de maintenir quelque part un référentiel centralisé des exceptions qu'on puisse utiliser dans l'application le package avec des exceptions nommées en clair est intéressant.

Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 21
Vieux 28/02/2011, 13h12   #5
Invité de passage
 
Inscription : janvier 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : janvier 2007
Messages : 3
Points : 2
Points : 2
Tu as catché l'exception dans le code de ta fonction :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
CREATE OR REPLACE PROCEDURE ma_procedure IS
    CODE_RETOUR_EXCEPTION EXCEPTION;
BEGIN
    raise CODE_RETOUR_EXCEPTION;
EXCEPTION 
    when CODE_RETOUR_EXCEPTION then
         DBMS_OUTPUT.PUT_LINE ('code retour 1');
   when OTHERS then
         raise;
END;
Si tu souhaites que l'exception CODE_RETOUR_EXCEPTION soit récupérée par l'appelant il faut mettre un "raise;" après ton dbms_output.put_line. De cette manière tu renvera l'exception vers l'appelant.

Dans le code que j'ai recopié ci-dessus (cf ton premier post). Tu écrit un message et ne fait rien ensuite puisque tu as traité l'exception dans ta procédure ma_procedure.
BigBenSun est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h04.


 
 
 
 
Partenaires

Hébergement Web