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