我必须为Select * from emp;
由于我不知道将返回多少行,因此无法预先分配我的缓冲区
所以我在关联输出缓冲区的同时定义了一个void **
指针。
我们的想法是将OCIStmtExecute
与iters = 0
称为
对于SELECT语句,如果iters非零,则必须为语句句柄完成定义。执行将iters行提取到这些预定义的缓冲区中,并根据预取行数预取更多行。如果您不知道SELECT语句将检索多少行,请将iters设置为零。
对于非SELECT语句,如果iters = 0,则此函数返回错误。
之后,我计划执行OCIAttrGet(OCI_ATTR_ROW_COUNT)
以获取select语句返回的行数,然后为输出缓冲区分配内存,然后通过指定返回的行数来调用OCIStmtFetch。
但是,即使表中返回了数据,我每次获得的行数也是0。
我的方法有一些缺陷吗?你能否指出这个缺陷
答案 0 :(得分:0)
您只需要为一行分配空间,然后重复调用OCIStmtFetch2()
,直到到达结果集的末尾(这将给出错误代码1403)。预取发生在由OCI本身维护的缓冲区中,对您来说是透明的,因此这种方法效率不高。