Oracle OCI - 获取延迟并失败

时间:2011-12-13 12:12:56

标签: oracle rdbms oci

我有一个Oracle OCI程序,它正在各种平台上生产:SLES Linux,Ubuntu,AIX,Solaris和HP-UX。我试图在Redhat上运行相同的东西,我遇到了困难。

使用可滚动游标(使用OCIStmtExecute调用OCI_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函数中等待服务器响应时不出所料。

之前有其他人见过这个问题吗?

1 个答案:

答案 0 :(得分:0)

问题似乎与版本11 OCI库有关。我刚刚尝试了v10库,它似乎再次正常工作。不幸的是,这需要旧版本的C ++标准库,所以如果有替代方案,我仍然希望避免这种修复。