4

ある Oracle サーバーのストアド プロシージャで、2 番目の Oracle サーバーのテーブルにレコードを挿入しようとすると、「分散更新操作に失敗しました。ロールバックが必要です」という例外で失敗します。

私のコードは BEGIN EXCEPTION END でラップされていますが、エラー ハンドラはエラーをトラップできません。

私はそれを2番目のエラーハンドラー内に投げても効果がありませんでした。このエラーをキャッチできない理由がわかりません。プロシージャは問題なくコンパイルされます。

私の主な目的は、エラーをキャッチして、ユーザーに役立つものを返すことです。さらに、可能であれば、エラーの根本に到達したいと考えています。

注1:「リモートエラー」を発生させる行のコメントを外すと、意図したとおりにキャッチされます。

注 2: リモート サーバーへの接続は安定しており、問題なくクエリを実行できます。

両方のサーバー: Oracle Database 11g リリース 11.2.0.3.0 - 64 ビット製品

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 に答える