通常、ORA-00942エラーはコンパイル時エラーになります。 Oracleは、コンパイル時にテーブルの名前を解決する必要があります。例外ハンドラは、コンパイル時ではなく、実行時にエラーをトラップします。
動的SQLを使用した場合は、名前の解決をランタイムに延期できます。その時点で、例外をキャッチできます。つまり、
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.
しかし、一般に、これはストアドプロシージャを作成するための賢明な方法ではありません。プロシージャは実際に存在するテーブルを認識している必要があり、構文エラーは実行時ではなく開発中に識別および解決する必要があります。