2009-06-08 19 views
1

Informixからデータを受け取り、Oracleのテーブルに挿入して元のテーブルのフラグを更新する単純なデータインポータ/アップデータに問題があります。設定は2つのコミットが、私はそれを扱うことができない1が、更新されたテーブルが2つのデータベースであり、単一のコミットので、それは忘れて(特定のOracleエラーを停止するために必要なこのInformixに接続されたOracleのリモートエージェントエラーへのRPC接続が失われました

Pro*C program calls a PL/SQL procedure 
The procedure 
    opens a cursor on Informix, 
    loops through each row 
    insert the data into an oracle table 
    commit 
    update the "new data" flag in Informix (i.e. stop a re-import) 
    commit 

です)。 このコードは、ソース表の少数のレコード(5-10)に対して正常に機能しますが、> 1000の場合には転倒します。Oracleログ・ディレクトリのアラート・ログには、「リモート・エージェントへのRPC接続の切断」というエラーが表示されます。 Informixディレクトリには対応するエラーはないため、ドライバに問題があると思われます。私たちは、Red HatのunixODBCドライバでOracle 10.2を使用しています。

回避策や修正方法はありますか?このエラーメッセージに関する有益な情報はないようです。ほとんどのページは、「Oracleの問題ではありません」という行に沿って何かを言います。

答えて

1

通常、COMMITは開いているカーソルを閉じます。 Informix上のカーソルをWITH HOLD(ESQL/C専門用語 - ODBCに変換する必要があります)というカーソルにする必要があるかもしれません。バッファリングのためにいくつかの行が動作する可能性があります。 1回のフェッチ操作でInformixから複数のレコード(10を超える場合がある)が収集され、カーソルが閉じられたときにデータベースに戻る時間が来たときにのみ問題が発生します。

私は説明としてこれに完全には満足していません。 UPDATEとCOMMITはカーソルを閉じたものとしてマークする必要があります。

Informix ODBCドライバ(Informix用の他のベンダーのODBCドライバとは対照的)を使用していると仮定すると、プログラムを開始する前に環境内でSQLIDEBUG = 2:xyzを設定することでデバッグできます。これは、名前が 'xyz _ ###'を始めるファイルを生成するはずです。ここで '###'は一連の数字であり、おそらく16進数です。このファイルは、sqliprintによって解釈されます。アプリケーションとInformixデータベースサーバとの間で伝達される情報が表示され、電線などを介して送信されたデータのグループ化が表示されることがあります。

+0

オラクルのデフォルト動作は、明示的に閉じられるまでカーソルを開いたままにしておき、それをシミュレートするためにドライバがInformixのカーソルをオープン/再オープンしている可能性があります。私は最終的にこの問題を回避するために、PL/SQLテーブルをバッファとして使用して、コミット回数を減らすことができました(100時間短縮)。 それでも問題はなぜ起こったのか説明していません... –

関連する問題