0

我被阻止了如何获取所有行的问题,即使用 setdatabuffer() 获取数组时的最后一行。在名为 example 的表中有 80405 行。OcciResultSet resultSet = occi.executeQuery("select x, y from example");

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 行。提前致谢。

4

1 回答 1

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。

于 2017-07-27T14:31:11.927 回答