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 02/04/2007, 17h33   #1
r83
Membre du Club
 
Inscription : mars 2003
Messages : 206
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 206
Points : 41
Points : 41
Par défaut exceptions plsql dans les sous blocs

voici mon code :
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
 
CREATE OR REPLACE procedure test(nb integer:=0)
IS
UneException Exception;
UneAutreException Exception;
UneExceptionExceptionnelle Exception;
begin
  IF nb=0 then
    raise UneException;
  end IF;
  begin 
    IF nb=10 then
    raise UneAutreException;
    elsif nb=20 then
      raise UneExceptionExceptionnelle;
    else
      dbms_output.put_line('sous bloc OK');
    end IF;
    exception
      when UneAutreException then
        raise_application_error(-20001, 'UneAutreException s''est déclenchée');
    end;
  dbms_output.put_line('bloc principal OK');  
exception
      when UneException then
        raise_application_error(-20002, 'UneException s''est déclenchée');
      when UneExceptionExceptionnelle then
        raise_application_error(-20003, 'UneExceptionExceptionnelle s''est déclenchée');
      when others then
        raise_application_error(-20999, 'Erreur inconnue');
end;
ma question :
pourquoi en passant 10 en paramètre lors de l'exécution, l'exception UneAutreExcepion ne se déclenche-t-elle pas dans le sous bloc et que c'est l'exception other du bloc principal qui se déclenche ?
Quand j'exécute ave 20, Une ExceptionExceptionnelle se déclenche bien.
Je pensais qu'on pouvait déclencher des exceptions dans un sous bloc.
Merci bonne soirée
r83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 21h35   #2
Membre Expert
 
Homme
Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)
Inscription : mars 2003
Messages : 645
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 41
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Expert Datawarehouses + BO (sur BDD Oracle et SQL Server)

Informations forums :
Inscription : mars 2003
Messages : 645
Points : 1 165
Points : 1 165
Citation:
Envoyé par r83
pourquoi en passant 10 en paramètre lors de l'exécution, l'exception UneAutreExcepion ne se déclenche-t-elle pas dans le sous bloc et que c'est l'exception other du bloc principal qui se déclenche ?
Ben ça parait logique
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  begin 
    if nb=10 then
    raise UneAutreException;
    exception
     when UneAutreException then  => 1.Interception UneAutreException
        raise_application_error(-20001, 'UneAutreException s''est déclenchée');
=> 2. envoi l'erreur -20001 au bloc d'au dessus 
(et non plus UneAutreException qui n'existe plus) 
    end;
      exception when UneException then xxxx
      when UneExceptionExceptionnelle then  xxx
      when others then => 3.Tout sauf UneException  et 
 UneExceptionExceptionnelle  donc raise
    raise_application_error(-20999, 'Erreur inconnue');
end;
Citation:
Envoyé par r83
Quand j'exécute ave 20, Une ExceptionExceptionnelle se déclenche bien.
Je pensais qu'on pouvait déclencher des exceptions dans un sous bloc.
Merci bonne soirée
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
begin
   begin 
    if nb=20 then
      raise UneExceptionExceptionnelle;
    else
      dbms_output.put_line('sous bloc OK');
    end if;
    exception
      when UneAutreException then
        raise_application_error(-20001, 'UneAutreException s''est déclenchée');
    1.  il n'y a pas de when others then null pour annuler l'exception. 
Donc elle existe toujours sous sa forme d'origine, 
donc elle remonte au bloc d'au dessus
    end;
exception
      when UneExceptionExceptionnelle then 
        raise_application_error(-20003, 'UneExceptionExceptionnelle s''est déclenchée'); 
=> 2. Voici UneExceptionExceptionnelle qui remonte du sous bloc
      when others then
        raise_application_error(-20999, 'Erreur inconnue');
end;
phili_b est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 23h06   #3
r83
Membre du Club
 
Inscription : mars 2003
Messages : 206
Détails du profil
Informations forums :
Inscription : mars 2003
Messages : 206
Points : 41
Points : 41
Par défaut exceptions plsql dans les sous blocs

Merci pour la réponse, c'est logique ...
Donc si je veux que le bloc continue après avoir levé l'exception, je dois tout faire sauf raise_application_error !!!
Sur la réponse, je crois deviner que l'on peut faire when others sauf -20001 ?
quelle est la syntaxe ?
Merci beaucoup !
BR
r83 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2007, 23h33   #4
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut ,

Dans la clause exception when others on peut utiliser :

sqlcode et sqlerrm

Donc il suffit de mettre
Code :
1
2
3
4
5
6
7
 
.
 
when others  then 
IF sqlcode<>-20001 then
.
end IF;
salim11 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 06h04.


 
 
 
 
Partenaires

Hébergement Web