我无法理解 Oracle 文档。:-(
有人知道如何通过 OCI 从 Oracle 获取多行简单数据吗?
我目前使用OCIDefineByPos
定义单个变量(我只需要对简单的整数执行此操作 - /4 字节整数),然后使用/SQLT_INT
一次获取一行。OCIStmtExecute
OCIStmtFetch2
这对于少量数据是可以的,但每行大约需要 0.5ms,所以当读取几万行时,这太慢了。
我只是不明白OCIBindArrayOfStruct
. 如何一次获取几千行?
我无法理解 Oracle 文档。:-(
有人知道如何通过 OCI 从 Oracle 获取多行简单数据吗?
我目前使用OCIDefineByPos
定义单个变量(我只需要对简单的整数执行此操作 - /4 字节整数),然后使用/SQLT_INT
一次获取一行。OCIStmtExecute
OCIStmtFetch2
这对于少量数据是可以的,但每行大约需要 0.5ms,所以当读取几万行时,这太慢了。
我只是不明白OCIBindArrayOfStruct
. 如何一次获取几千行?
您是否查看过 $ORACLE_HOME/oci/samples 中的示例代码(如果您没有安装它们,则运行 Oracle 安装程序并告诉它安装示例代码)。有几个使用批量接口。
您可能需要认真考虑改用库。我编写了 Pro*C(讨厌它)、直接 OCI,并使用了 3rd 方库。最后一个是最好的,在很大程度上。OCI 语法非常繁琐,并且有一些您可能永远不会使用的选项。同时,它非常、非常僵化,如果你做的事情哪怕是一点点错误都会让你的代码崩溃。
如果您使用的是 C++,那么我可以推荐OTL;我已经进行了一些严格的性能测试,OTL 与一般情况下的手动编码一样快(如果您确定您的数据中没有 NULL,因此不需要指标,您可以将其击败 5-10%数组)。注意——不要试图理解 OTL 代码。这很可怕。但它真的很好用。
还有许多 C 库封装了 OCI 并使其更可用且不太可能咬你,但我没有测试过它们中的任何一个。
如果不出意外,请帮自己一个忙,为 OCI 代码编写包装函数以使事情变得更容易。我在我的高性能场景中做到了这一点,它大大减少了我遇到的问题的数量。
您可以使用它OCIDefineArrayOfStruct
来支持获取记录数组。您可以通过将数组的基数传递给 来做到这一点OCIDefineByPos
,并使用它OCIDefineArrayOfStruct
来告诉 Oracle 记录的大小(跳过大小)。我相信你然后打电话OCIFetch
告诉它获取数组大小。
OCI_ATTR_PREFETCH_ROWS
另一种方法是在执行之前设置语句属性 , 。这告诉 Oracle 一次要获取多少行,默认为 1。使用这种方法,Oracle 可以减少往返次数并为您缓冲行。
OCIBindArrayOfStruct
与 DML 语句一起使用。它的工作方式与绑定变量类似OCIDefineArrayOfStruct
。
您可以在 Oracle 网站上找到示例代码。