本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《
阿里云开发者社区用户服务协议
》和
《
阿里云开发者社区知识产权保护指引
》。如果您发现本社区中有涉嫌抄袭的内容,填写
侵权投诉表单
进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
UPDATE
emp
SET
ename
=
'
test01
'
WHERE
empno
=
7369
;
/*
this will raise no_data_found exception
*/
SELECT
empno
INTO
v_id
FROM
emp
WHERE
empno
=
12345
;
END
;
CREATE
OR
REPLACE
PROCEDURE
test02
IS
BEGIN
UPDATE
emp
SET
ename
=
'
test02
'
WHERE
empno
=
7499
;
/*
call another procedure
*/
test01;
EXCEPTION
WHEN
NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE(
'
execption occured.!
'
);
END
;
test02 调用 test01 ,由于 test01处理SQL文的时候,select 语句试图查找一条并不存在的记录,导致 NO_DATA_FOUND 发生。
而这个异常实际上是发生在test01 内部,但是test01 没有处理这个异常的代码逻辑,所以就抛给了test02。
然后,按照 oracle 文档的说法:
test02 处理完此 NO_DATA_FOUND 异常后,因为异常已经处理完毕,所以test01的异常之前的代码并没有rollback,而是继续和 test02 中的语句一起参与运算,最终一起被提交。
所以查询结果是:
empno 为 7369 和 7499 的数据都被改变了!
不过,目前这个结论还不太可靠,因为,单纯的异常并没使得SQL失效。比如下例:
CREATE OR REPLACE PROCEDURE test03 IS
v_id emp.empno%TYPE;
BEGIN
UPDATE emp SET ename='test03' WHERE empno=7369;
/*this will raise no_data_found exception*/
SELECT empno INTO v_id FROM emp WHERE empno=12345;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Exception Occured!');
END;