【问题标题】:Oracle: Capturing Specific Oracle Message with EXCEPTION_INITOracle:使用 EXCEPTION_INIT 捕获特定的 Oracle 消息
【发布时间】:2016-08-12 03:43:28
【问题描述】:

我想处理ORA-000942 的异常,我正在关注这个manual 和这个discussion。由于这是一个没有预定义名称的ORA- 错误,我想使用exception_init.

当我运行此代码时,我继续收到 ORA-000942 消息,但不是通过过程级处理程序获得的预期结果。

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;

问题:

  1. 如何让我的过程级异常来处理 -942 错误?

【问题讨论】:

    标签: oracle plsql oracle11g exception-handling


    【解决方案1】:

    PL/SQL 编译器在尝试编译语句时抛出您遇到的错误

    insert into foobaz
      select 1 from dual
    

    因为foobaz 表当然不存在。内联 SQL 语句必须在编译时有效,因此编译器会抛出异常。

    要解决这个问题,您必须使用动态 SQL,如下所示:

    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;
    

    上面产生了预期的输出:

    MISSING TABLE
    DONE
    

    祝你好运。

    【讨论】:

    • 是的,编译失败,在你能够执行之前
    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2018-07-06
    • 2017-10-08
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多