Oracle OCI数组获取简单数据类型?

时间:2008-09-19 10:49:41

标签: c++ c database oracle oci

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

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

我目前使用OCIDefineByPos来定义单个变量(我只需要对简单的整数执行此操作 - SQLT_INT / 4-byte ints)然后使用{{一次一次获取一行1}} / OCIStmtExecute

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

我只是不理解OCIStmtFetch2的文档。我怎样才能一次获取几千行?

2 个答案:

答案 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网站上找到示例代码。