2016-04-19 4 views
0

Ich möchte eine Ausnahme für ORA-000942 behandeln und bin diesem manual und diesem discussion folgen. Da dies ein ORA- Fehler ohne vordefinierten Namen ist, möchte ich exception_init.Oracle: Erfassen einer bestimmten Oracle-Nachricht mit EXCEPTION_INIT

verwenden, wenn ich diesen Code ausführen, weiterhin ich die ORA-000942 Nachricht erhalten, aber nicht über das Verfahren Level-Handler erwartet.

create table foobar (foobar_id varchar(1)); 

declare 

procedure p_add_to_foobar 
is 
p_missing_table exception; 
pragma exception_init(p_missing_table, -00942); 

begin 
insert into foobaz 
select '1' from dual; 

    exception 
    when p_missing_table then 
    dbms_output.put_line('MISSING TABLE'); 
    end p_add_to_foobar; 


begin 
p_add_to_foobar; 
dbms_output.put_line('DONE'); 
end; 

Frage:

  1. Wie erhalte ich mein Verfahren Ebene Ausnahme der -942 Fehler zu behandeln?

Antwort

4

Der Fehler Sie bekommen durch die PL/SQL-Compiler geworfen wird, wenn es die Anweisung

insert into foobaz 
    select 1 from dual 

weil natürlich zu kompilieren versucht die foobaz Tabelle existiert nicht. Inline-SQL-Anweisungen müssen zur Kompilierungszeit gültig sein, und der Compiler löst daher eine Ausnahme aus.

Um dies zu umgehen Sie dynamische SQL verwenden müssen, wie in:

declare 
procedure p_add_to_foobar is 
    p_missing_table exception; 
    pragma exception_init(p_missing_table, -00942); 
begin 
    EXECUTE IMMEDIATE 
    'insert into foobaz 
     select ''1'' from dual'; 
    exception 
    when p_missing_table then 
     dbms_output.put_line('MISSING TABLE'); 
    end p_add_to_foobar; 
BEGIN 
    p_add_to_foobar; 
    dbms_output.put_line('DONE'); 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE('WHEN OTHERS: ' || SQLERRM); 
END; 

Die oben erzeugt die erwartete Ausgabe:

MISSING TABLE 
DONE 

Best of luck.

+0

Ja, es schlägt bei der Kompilierung fehl, bevor Sie es ausführen können –

Verwandte Themen