2010-11-17 7 views
3

j'ai un tel code:Gestion des erreurs Oracle

DECLARE 
    e_not_exist EXCEPTION; 
    PRAGMA EXCEPTION_INIT(e_not_exist, -942); 
    car_name VARCHAR2(20); 
BEGIN 
    select name_of_factory into car_name from car where car_id = 1; 
    dbms_output.put_line(car_name); 
EXCEPTION 
    when e_not_exist then 
    dbms_output.put_line('Table or view does not exist'); 
    when OTHERS then 
    dbms_output.put_line(to_char(SQLCODE)); 
END; 

En fait, mon nom de la table est CARS mais pas CAR. Mais Oracle ne gère pas cette exception et me donne une erreur ORA-00942: La table ou la vue n'existe pas. Comment puis-je gérer cette exception?

Répondre

5

Vous ne pouvez pas faire cela avec SQL statique. L'erreur arrive quand le code est compilé, pas exécuté. Essayez ceci à la place:

execute immediate 'select name_of_factory from car where car_id = 1' 
        into car_name ; 
+0

merci. Si je comprends bien, il y a des erreurs de compilation et d'exécution. Comment puis-je identifier l'erreur d'exécution ou de compilation si je connais le numéro d'erreur? – maks

+0

Ce n'est pas basé sur le nombre. Comme vous pouvez le voir à partir de cet exemple, la même erreur (-942) peut être soit à l'exécution, soit à la compilation selon les circonstances. Le problème est que lorsque vous utilisez DECLARE/BEGIN inline, il est difficile de faire la différence. Une option consiste à créer une procédure, puis à l'exécuter. Une autre consiste à faire ce que vous avez ici - puisque vous utilisez 'WHEN OTHERS', toutes les exceptions d'exécution seront interceptées de cette façon, donc les erreurs immédiates qui apparaîtront seront des temps de compilation. – Dan

6

Une erreur ORA-00942 est généralement une erreur de compilation. Oracle doit résoudre le (s) nom (s) des tables au moment de la compilation. Les gestionnaires d'exceptions intercepteront les erreurs lors de l'exécution, pas pendant la compilation.

Si vous utilisez SQL dynamique, vous pouvez reporter la résolution des noms à la durée d'exécution à quel point vous pouvez prendre l'exception, à savoir

SQL> ed 
Wrote file afiedt.buf 

    1 declare 
    2 no_such_table exception; 
    3 pragma exception_init(no_such_table, -942); 
    4 l_cnt integer; 
    5 begin 
    6 execute immediate 'select count(*) from emps' into l_cnt; 
    7 exception 
    8 when no_such_table 
    9 then 
10  dbms_output.put_line('No such table'); 
11* end; 
SQL>/
No such table 

PL/SQL procedure successfully completed. 

Mais ce n'est pas une manière sensible, en général, d'écrire stockées procédures. Vos procédures doivent savoir quelles tables existent réellement et les erreurs de syntaxe doivent être identifiées et résolues pendant le développement, et non lors de l'exécution.