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