【发布时间】:2011-12-13 12:12:56
【问题描述】:
我有一个 Oracle OCI 程序,它在各种平台上投入生产:SLES Linux、Ubuntu、AIX、Solaris 和 HP-UX。我正在尝试在 Redhat 上运行相同的程序,但遇到了困难。
当使用可滚动光标(使用OCI_STMT_SCROLLABLE_READONLY 调用OCIStmtExecute)并使用执行二分搜索以获得确切结果集大小的函数时,问题似乎出现了。更一般地说,问题似乎是在读取结果集的末尾,在读取 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 函数中。
以前有没有其他人见过这个问题?
【问题讨论】:
标签: oracle rdbms oracle-call-interface