开始
如果对异常处理不正确,有可能会导致意想不到的结果。下面这个就是:
先写两个存储过程 test01 和 test02:
CREATE OR REPLACE PROCEDURE test01 IS v_id emp.empno%TYPE; BEGIN 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;
结束