4

私はそのようなコードを持っています:

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;

実際、私のテーブル名はCARSですが、CARではありません。しかし、オラクルはこの例外を処理せず、エラー ORA-00942: テーブルまたはビューが存在しません。この例外を処理するにはどうすればよいですか?

4

2 に答える 2

8

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.

しかし、それは一般に、ストアド プロシージャを記述するための賢明な方法ではありません。手順では、実際に存在するテーブルを把握し、実行時ではなく開発中に構文エラーを特定して解決する必要があります。

于 2010-11-17T19:53:20.857 に答える
6

静的 SQL ではそれができません。コードが実行されているのではなく、コンパイルされているときにエラーが発生します。代わりにこれを試してください:

 execute immediate 'select name_of_factory from car where car_id = 1' 
                    into car_name ;
于 2010-11-17T19:50:51.203 に答える