【问题标题】:Oracle Database 11g Express: Errors and Exception HandlingOracle Database 11g Express:错误和异常处理
【发布时间】:2017-09-21 23:58:25
【问题描述】:

我有一个运行不返回数据的查询的过程,目的是为了测试错误处理:

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

【问题讨论】:

  • 您的意思是当您创建该过程时,或者您随后运行它时收到该错误消息?

标签: oracle oracle11g


【解决方案1】:

异常块末尾有RAISE statement

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

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

语句级原子性

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

成功的语句不同于已提交的事务。一个 如果数据库解析并成功执行单个 SQL 语句 作为一个原子单元运行它而不会出错,就像所有行都更改时一样 在多行更新中。

如果 SQL 语句在执行过程中导致错误,那么它不是 成功,因此该语句的所有效果都将回滚。这个 操作是语句级回滚。此操作具有 以下特点:

  • 不成功的 SQL 语句只会导致其本应执行的工作丢失。

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

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

原子语句的任何副作用,例如,调用的触发器 在执行语句时,被认为是原子的一部分 陈述。作为原子语句的一部分生成的所有工作 成功或不成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 2014-04-06
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多