1

Oracle OCIプログラムがあります。これは、SLES Linux、Ubuntu、AIX、Solaris、HP-UXなどのさまざまなプラットフォームで運用されています。Redhatで同じことを実行しようとしていますが、問題が発生しています。

この問題は、スクロール可能なカーソル(を使用して呼び出すOCIStmtExecuteOCI_STMT_SCROLLABLE_READONLYを使用し、バイナリ検索を実行して正確な結果セットのサイズを取得する関数を使用する場合に発生するようです。より一般的には、問題は、OK値を読み取る前に、結果セットの終わりを超えて読み取ることであるように思われます。

1行(SELECT COUNT(*) FROM xxx)を返さなければならない単純なステートメントを実行するテストユーティリティを作成しました。次に、結果セットからデータを取得します。

最初に行1を取得すると、正常に機能します。その後、結果セットの終わりを超えても、戻ったときに正常に機能し続けます。しかし、私の最初のチェックが結果セットの後である場合、すべてがうまくいきません。

> rdb_test 1
12:06:32.365 Checking row 1 - OK

> rdb_test 3
12:06:35.510 Checking row 3 - NO DATA
12:06:35.511 Checking row 2 - NO DATA
12:06:45.549 Checking row 1 - NO DATA

> rdb_test -3
12:06:49.344 Checking row 1 - OK
12:06:49.344 Checking row 3 - NO DATA
12:06:49.345 Checking row 2 - NO DATA
12:06:49.345 Checking row 1 - OK

また、問題のない行を取得している間、上記の例では10秒という奇妙な遅延があります。デバッガーでは、これはOCIStmtFetch2関数の奥深くにあります。当然のことながら、サーバーの応答を待機している__read_nocancel関数の奥深くにあります。

他の誰かが以前にこの問題を見たことがありますか?

4

1 に答える 1

0

この問題は、バージョン11のOCIライブラリに関連しているようです。v10ライブラリを試したところ、それで再び問題なく動作するようです。残念ながら、これには古いバージョンのC ++標準ライブラリが必要なので、別のバージョンが利用できる場合は、この修正を避けたいと思います。

于 2011-12-13T13:52:45.507 に答える