2017-07-27 4 views
0

setdatabuffer()によって配列フェッチを使用すると、すべての行をフェッチする方法が最後の左側の行になります。 exampleという名前のテーブルに80405行あります。OcciResultSet resultSet = occi.executeQuery( "select x、y from example");setdatabuffer()によって配列フェッチを使用すると、すべての行をフェッチする方法

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行をフェッチする方法。ありがとうございます。

+0

[this](https://docs.oracle.com/cd/B19306_01) /appdev.102/b14294/performance.htm#CHDIDIDE)help?あなたのforループに見られる問題は、 'size'ではなく、i == resultSet-> getNumArrayRows()までiterateする必要があるということです。 'size'はフェッチできる行の最大数です。実際にフェッチされた行の数は少ないので、実際にフェッチされた行数を示す方法があります。 – jeff6times7

+0

@ jeff6times7、はい、resultSet-> getNumArrayRows()は安全です。 'size'は大丈夫です。 oracle pageでのsetdatabuffer()の説明 'これにより、numRows分のデータが各列にフェッチされます。 setDataBuffer()インタフェースで指定されたバッファは、少なくともデータのnumRowを保持するのに十分な大きさでなければなりません。今は唯一の方法です:最初の405行をフェッチし、配列フェッチで最後の800000行をフェッチします。 – ruuut

答えて

0

whileループの8回目の反復では、sizeは10000で、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を返しました。

関連する問題