Oracle Database 11g Express:错误和异常处理

时间:2017-09-21 15:28:33

标签: oracle oracle11g

我有一个运行查询的过程,该查询不返回任何数据,用于测试错误处理:

create or replace procedure archive_aggreg(p_to_date in date) 
is

 v_lname VARCHAR2 (15);
begin

       SELECT city INTO v_lname
         FROM CHAIN1;


    FOR Lcntr IN 1..100000
LOOP
   INSERT INTO CHAIN1 VALUES (1, TO_CHAR(p_to_date, 'FMMonth DD, YYYY HH24:MI:SS'),  TO_CHAR(p_to_date, 'FMMonth DD, YYYY HH24:MI:SS'));
END LOOP;   

commit;

EXCEPTION
   WHEN OTHERS
   THEN
      DECLARE
         l_code   INTEGER := SQLCODE;
      BEGIN
         INSERT INTO T_LOG (  
                               error_code
                              ,  error_message
                              ,  backtrace
                              ,  callstack
                              ,  created_on
                              ,  created_by)
              VALUES (
                    l_code
                    ,  sys.DBMS_UTILITY.format_error_stack
                    ,  sys.DBMS_UTILITY.format_error_backtrace
                    ,  sys.DBMS_UTILITY.format_call_stack
                    ,  SYSDATE
                    ,  USER);

         RAISE;
      END;

end;

除了要插入表T_LOG中的错误,但情况并非如此,但在PL / SQL Developer控制台中,我收到了以下消息:

ORA-01403: no data found

1 个答案:

答案 0 :(得分:0)

异常块末尾有RAISE statement

EXCEPTION
   WHEN OTHERS
   THEN
         ......
         ......
         RAISE;
      END;
end;

此命令将错误引发到调用子程序。回滚整个PL / SQL语句(过程中的开始 - 结束块,被视为单个语句),包括INSERT语句插入的行,因为Oracle支持statement level atomicy

  

声明级原子性

     

Oracle数据库支持语句级原子性,这意味着a   SQL语句是一个原子工作单元,要么完全成功   或完全失败。

     

成功的声明与已提交的事务不同。一个   如果数据库解析和,则单个SQL语句成功执行   在没有错误的情况下运行它作为原子单元,就像所有行都被更改一样   在多行更新中。

     

如果SQL语句在执行期间导致错误,则不是   成功,所以声明的所有效果都会被回滚。这个   operation是一个语句级回滚。这个操作有   以下特点:

     
      
  • 一个不成功的SQL语句只会导致它本身已经完成的工作丢失。

  •   
  • 不成功的声明不会导致当前事务中丢失之前的任何工作。例如,如果执行   “示例交易:帐户借记”中的第二个UPDATE语句   和信用“导致错误并被回滚,然后工作   第一个UPDATE语句执行的操作不会回滚。首先   可以通过显式提交或回滚UPDATE语句   用户。

  •   
  • 回滚的效果就好像从未运行过该语句一样。

  •   
     

原子语句的任何副作用,例如触发器被调用   在执行声明时,被视为原子的一部分   声明。要么所有工作都是作为原子语句的一部分生成的   成功或没有成功。