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 回答