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。但是 oracle 不处理此异常并给我一个错误 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 回答