4

在一台 Oracle 服务器上的存储过程中,我尝试将一条记录插入到另一台 Oracle 服务器上的表中,但失败并出现异常“分布式更新操作失败;需要回滚”

尽管我的代码包含在 BEGIN EXCEPTION END 中,但错误处理程序无法捕获错误。

我什至把它扔到了第二个错误处理程序中,但没有任何效果。知道为什么我无法捕捉到这个错误。程序编译没有问题。

我的主要目标是捕获错误,以便我可以返回对我的用户有用的东西。此外,如果可能的话,我想找出错误的根源。

注意 1:如果我取消注释引发“远程错误”的行,那么它会按预期被捕获。

注意 2:与远程服务器的连接是可靠的,因为我可以毫无问题地查询它。

两台服务器都是:Oracle Database 11g Release 11.2.0.3.0 - 64bit Production

BEGIN                                                                 
    begin
      --raise_application_error( -20001, 'Remote Error' );
      insert into RemoteSchema.RemoteObject@RemoteSystem
        (field_one, field_two)
        select value_one, value_two from dual;
     exception
       when others then
         raise_application_error( -20000, 'Remote Error:' || sqlerrm );
     end;
 exception
   when others then
     raise_application_error( -20000, 'Caught Remote Error:' || sqlerrm );
 end;
4

1 回答 1

2

经过更多调试后,一位同事帮助我发现了问题。错误消息令人困惑,因为更新实际上是成功的,但成功意味着现在有一个带有“分布式更新”的活动事务。

当我的代码遇到随后的小错误时,Oracle 引发了错误消息“分布式更新操作失败;需要回滚”,因为现在有一个事务需要先回滚,然后我才能引发以下错误。

在我的调试中,我没有看到将我发送到正确方向的完整消息。

于 2012-09-13T17:08:37.827 回答