1

我无法理解 Oracle 文档。:-(

有人知道如何通过 OCI 从 Oracle 获取多行简单数据吗?

我目前使用OCIDefineByPos定义单个变量(我只需要对简单的整数执行此操作 - /4 字节整数),然后使用/SQLT_INT一次获取一行。OCIStmtExecuteOCIStmtFetch2

这对于少量数据是可以的,但每行大约需要 0.5ms,所以当读取几万行时,这太慢了。

我只是不明白OCIBindArrayOfStruct. 如何一次获取几千行?

4

2 回答 2

3

您是否查看过 $ORACLE_HOME/oci/samples 中的示例代码(如果您没有安装它们,则运行 Oracle 安装程序并告诉它安装示例代码)。有几个使用批量接口。

您可能需要认真考虑改用库。我编写了 Pro*C(讨厌它)、直接 OCI,并使用了 3rd 方库。最后一个是最好的,在很大程度上。OCI 语法非常繁琐,并且有一些您可能永远不会使用的选项。同时,它非常、非常僵化,如果你做的事情哪怕是一点点错误都会让你的代码崩溃。

如果您使用的是 C++,那么我可以推荐OTL;我已经进行了一些严格的性能测试,OTL 与一般情况下的手动编码一样快(如果您确定您的数据中没有 NULL,因此不需要指标,您可以将其击败 5-10%数组)。注意——不要试图理解 OTL 代码。这很可怕。但它真的很好用。

还有许多 C 库封装了 OCI 并使其更可用且不太可能咬你,但我没有测试过它们中的任何一个。

如果不出意外,请帮自己一个忙,为 OCI 代码编写包装函数以使事情变得更容易。我在我的高性能场景中做到了这一点,它大大减少了我遇到的问题的数量。

于 2008-09-19T14:09:23.080 回答
3

您可以使用它OCIDefineArrayOfStruct来支持获取记录数组。您可以通过将数组的基数传递给 来做到这一点OCIDefineByPos,并使用它OCIDefineArrayOfStruct来告诉 Oracle 记录的大小(跳过大小)。我相信你然后打电话OCIFetch告诉它获取数组大小。

OCI_ATTR_PREFETCH_ROWS另一种方法是在执行之前设置语句属性 , 。这告诉 Oracle 一次要获取多少行,默认为 1。使用这种方法,Oracle 可以减少往返次数并为您缓冲行。

OCIBindArrayOfStruct与 DML 语句一起使用。它的工作方式与绑定变量类似OCIDefineArrayOfStruct

您可以在 Oracle 网站上找到示例代码。

于 2008-09-28T21:31:17.503 回答