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 ?
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