ORA-00604: 递归SQL级别1出现错误, ORA-02067:要求事务处理或保存回退点

报的错如题:
ORA-00604: 递归SQL级别1出现错误 



ORA-02067:要求事务处理或保存回退点

A服务器Oracle建立dblink,存储过程的内容是:往B服务器中oracle的表里插入数据。 在客户端访问调用此存储过程的时候报以上错误。



解決模拟



<span style="font-family: 'Microsoft YaHei';">客户系统经常报错误ORA-02067,搜了一下,有关这个错误的解释几乎都是:  </span>
Cause: A failure (typically a trigger or stored procedure with multiple remote updates) occurred such that the all-or-nothing execution of a previous Oracle call cannot be guaranteed.  
  
Action: rollback to a previous savepoint or rollback the transaction and resubmit.  
[@more@]  
下面是我的一个模拟过程:  
C:>sqlplus system/system@orcl  
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 9月 3 21:33:32 2011  
Copyright (c) 1982, 2005, Oracle. All rights reserved.  
  
连接到:  
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
With the Partitioning, OLAP and Data Mining options  
SQL> create table t(id int primary key) tablespace users;  
表已创建。  
SQL>  
--==================================  
C:>sqlplus system/system@test  
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 9月 3 21:32:37 2011  
Copyright (c) 1982, 2005, Oracle. All rights reserved.  
  
连接到:  
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production  
With the Partitioning, OLAP and Data Mining options  
SQL> create table t(id int primary key) tablespace users;  
表已创建。  
SQL> create public database link dbl connect to system identified by system using 'orcl';  
数据库链接已创建。  
SQL> select sysdate from dual@dbl;  
SYSDATE  
-------------------  
2011-09-03 21:34:10  
SQL> declare  
2 begin  
3 insert into t@dbl values(1);  
4 insert into t values(1);  
5 insert into t values(1);  
6 commit;  
7 end;  
8 /  
declare  
*  
第 1 行出现错误:  
ORA-02055: 分布式更新操作失效; 要求回退  
ORA-00001: 违反唯一约束条件 (SYSTEM.SYS_C002971)  
ORA-06512: 在 line 5  
  
SQL> select sysdate from dual;  
select sysdate from dual  
*  
第 1 行出现错误:  
ORA-02067: 要求事务处理或保存点回退  
  
SQL> rollback;  
回退已完成。  
SQL> declare  
2 begin  
3 insert into t values(1);  
4 insert into t@dbl values(1);  
5 insert into t@dbl values(1);  
6 commit;  
7 end;  
8 /  
declare  
*  
第 1 行出现错误:  
ORA-02055: 分布式更新操作失效; 要求回退  
ORA-00001: 违反唯一约束条件 (SYSTEM.SYS_C004151)  
ORA-02063: 紧接着 line (起自 DBL)  
ORA-06512: 在 line 5  
  
SQL> select sysdate from dual;  
select sysdate from dual  
*  
第 1 行出现错误:  
ORA-02067: 要求事务处理或保存点回退  
  
SQL>  
--==================================  
造成这个错误的最根本的原因是通过dblink远程更新以及同时还要涉及到本地更新时,其中一部分失败了,但是没有出错处理,或者准确的说是没有rollback,这样错误ORA-02067还不是被直接报出来,而是如果没有在该session中执行rollback,之后不论执行什么错误都会在这个session中报ORA-02067错误,那怕是执行一个查询,这也是不好模拟的原因,客户的系统报了这个错误之后输出的sql都是一个非常简单的查询,所以前面到底执行了什么sql不容易捕获。  
出现错误之后如果不修改程序,我觉得似乎没有什么办法,只能是重启实例,或者断开所有连接...  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值