0

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 行を取得する方法。前もって感謝します。

4

1 に答える 1

0

while ループの 8 回目の繰り返しでは、size10000 でgetNumArrayRows()、1 から 10000 までの整数が返されました。これ以上行がなかったため、9 回目の繰り返しはありませんでした。8 回目の反復で、for ループは 7 回目の反復から 0 行以上を出力しました。投稿の文言では、読者が 80405 行を返すことを期待しています。しかし、ODP に新しいバグが見つからない限り、リーダーの実際のクエリは 70001 ~ 80000 行を返しました。

たとえば、リーダーのクエリが 79999 行を返した場合、コードは行 1 から 70000 を出力し、次に行 70001 から 79999 を出力し、次に行 70000 を出力します。リーダーがそれぞれの配列の最後の要素のメモリを設定せず、フェッチされた最後の行を処理した後に for ループ イテレータが停止しなかったため、行 70000 が再度出力されました。つまり、この例では、while ループの最初の 7 回の反復でgetNumArrayRows()10000 が返され、8 回目の反復で 9999 が返されました。

于 2017-07-27T14:31:11.927 に答える