在存储过程A中有这样的语句:
procedureA
begin
.....
insert .... select functionB(COL1,..) from t1;
....
commit;
exception
when others then
rollback;(将所有insert的数据回滚掉)
end procedureA;
而functionB有时会因为参数问题而无法正常计算,为了记录这些异常,在functionB中写了这样的语句:exception
when others then
insert into t2...
commit;但functionB中的commit语句会将procedureA的未提交的数据也提交,造成数据不一致。
怎么办好呢?还望高手指点,不甚感激!
procedureA
begin
.....
insert .... select functionB(COL1,..) from t1;
....
commit;
exception
when others then
rollback;(将所有insert的数据回滚掉)
end procedureA;
而functionB有时会因为参数问题而无法正常计算,为了记录这些异常,在functionB中写了这样的语句:exception
when others then
insert into t2...
commit;但functionB中的commit语句会将procedureA的未提交的数据也提交,造成数据不一致。
怎么办好呢?还望高手指点,不甚感激!
解决方案 »
- 急求,oracle9i与oracle10g能同时安装吗
- instantclient的问题
- 急!!!!!!!~~~~~~~这个触发器怎么写!
- 免安装的客户端无法运行sqlldr
- EXECUTE IMMEDIATE 的执行语句大于32k 怎么办?
- 请问如何在XP上安装Oracle?
- 我用SQL PLUS, SELECT 一个有50万条记录的表,为什么会中途停止,将近一个小时候停止
- pl/sql当中主过程的%ROWTYPE型变量在子过程中如何引用???
- 用批处理写热备份时碰到一个问题!
- 关于oracle数据转换问题
- occi连接oracle的时候 sys用户无法连入进去 sqlplus可以
- oracle 插入的值对于列过大
删除procedureA中原来的commit
在procedureA的end前加一个commit就OKay了。
(1) procedureA插入数据,没有发生异常"在procedureA的end前加一个commit",它能COMMIT functionB 产生异常所插入的数据和procedureA所插入的数据(2) procedureA插入数据,发生异常
when others then
rollback;(将所有insert的数据回滚掉)
它应该能ROLLBACK掉functionB 产生异常所插入的数据和procedureA所插入的数据我是这样理解的,没有测试过,你自己弄两个表测试下。
對於異常記錄部分,可以使用自治事务。
CREATE OR REPLACE function err_log(....) as
PRAGMA AUTONOMOUS_TRANSACTION; -- 創建自治事務,保存程序異常.
begin
;
commit; -- 只作用於此函數,不對外層擴展。
end;