我有一个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函数中等待服务器响应时不出所料。
之前有其他人见过这个问题吗?
答案 0 :(得分:0)
问题似乎与版本11 OCI库有关。我刚刚尝试了v10库,它似乎再次正常工作。不幸的是,这需要旧版本的C ++标准库,所以如果有替代方案,我仍然希望避免这种修复。