我有一个运行查询的过程,该查询不返回任何数据,用于测试错误处理:
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
答案 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语句 用户。
回滚的效果就好像从未运行过该语句一样。
原子语句的任何副作用,例如触发器被调用 在执行声明时,被视为原子的一部分 声明。要么所有工作都是作为原子语句的一部分生成的 成功或没有成功。