如何通过setdatabuffer()使用数组提取时获取所有行

时间:2017-07-27 02:05:59

标签: oracle occi

我阻止了如何获取所有行的问题,即使用setdatabuffer()进行数组提取时的最后左行。 名为example的表中有80405行。     OcciResultSet resultSet = occi.executeQuery("选择x,y来自示例");

const int size = 10000;
double xs[size], ys[size];
ub4 *length = NULL;
resultSet->setDataBuffer(1, &xs[0], oracle::occi::OCCIBDOUBLE, sizeof(xs[0]), length);
resultSet->setDataBuffer(2, &ys[0], oracle::occi::OCCIBDOUBLE, sizeof(ys[0]), length);

int count = 0;
while (resultSet->next(size) == oracle::occi::ResultSet::DATA_AVAILABLE)
{
    for (int i = 0; i < size; i++)
    {
        printf("row: %d\n", ++count);
        double x = xs[i];
        double y = ys[i];
    }
}

只能获取前80000行。剩下最后405行,如何获取最后405行。 提前谢谢。

1 个答案:

答案 0 :(得分:0)

在while循环的第8次迭代中,size为10000,getNumArrayRows()返回1到10000之间的整数。没有更多的行,这就是为什么没有第9次迭代。在第8次迭代中,for循环在第7次迭代中打印了0行或更多行。您对帖子进行措辞的方式,您希望读者返回80405行。但除非您在ODP中发现了新的错误,否则读者的实际查询会在70001到80000行之间返回。

例如,如果读者的查询返回了79999行,那么您的代码将打印行1到70000,然后打印行70001到79999,然后再打印行70000。它再次打印了70000行,因为读者没有为各个数组的最后一个元素设置内存,并且for循环迭代器在处理完最后一行后没有停止。换句话说,对于此示例,在while循环的前7次迭代中getNumArrayRows()返回10000,在第8次迭代时返回9999。