【问题标题】:Oracle errors handlingOracle 错误处理
【发布时间】:2011-05-11 15:25:08
【问题描述】:

我有这样的代码:

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:表或视图不存在。 我该如何处理这个异常?

【问题讨论】:

    标签: sql oracle plsql ora-00942


    【解决方案1】:

    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.
    

    但这不是一个明智的方式,一般来说,编写存储过程。您的程序应该知道实际存在哪些表,并且应该在开发期间而不是在运行时识别和解决语法错误。

    【讨论】:

      【解决方案2】:

      静态 SQL 无法做到这一点。代码正在编译而不是执行时出现错误。试试这个:

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

      【讨论】:

      • 谢谢。据我了解,存在编译和运行时错误。如果知道错误号,如何识别运行时或编译错误?
      • 不是基于数量的。正如您从这个非常示例中看到的,相同的错误 (-942) 可以是运行时或编译时,具体取决于具体情况。问题是当您使用 DECLARE/BEGIN 内联时,很难区分。一种选择是实际创建一个过程,然后执行它。另一个是做你在这里做的事情——因为你使用的是WHEN OTHERS,所有运行时异常都会以这种方式被捕获,所以任何立即弹出的错误都将是编译时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多