2017-07-27 2 views
0

J'ai bloqué le problème comment récupérer toutes les lignes, c'est-à-dire les dernières lignes restantes quand on utilise array fetch par setdatabuffer(). il y a 80405 lignes dans une table nommée exemple. OcciResultSet resultSet = occi.executeQuery ("sélectionnez x, y dans l'exemple");comment récupérer toutes les lignes en utilisant array fetch par 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]; 
    } 
} 

ne peut extraire que les 80000 premières lignes. il reste 405 lignes, comment récupérer les 405 dernières lignes. merci d'avance.

+0

Does [this] (https://docs.oracle.com/cd/B19306_01 /appdev.102/b14294/performance.htm#CHDIDIDE) aide? Le problème que je vois dans votre boucle for est qu'il doit itérer jusqu'à ce que i == resultSet-> getNumArrayRows(), pas 'size'. 'size' est le nombre maximum de lignes pouvant être récupérées. Le nombre réel de lignes récupérées peut être inférieur et c'est pourquoi il existe une méthode pour vous dire combien ont été réellement récupérées. – jeff6times7

+0

@ jeff6times7, yes, resultSet-> getNumArrayRows() est sûr pour la sauvegarde. mais "taille" est ok. la description de setdatabuffer() sur la page oracle 'Cela provoque jusqu'à la quantité numRows de données à extraire pour chaque colonne. Les tampons spécifiés avec l'interface setDataBuffer() doivent être suffisamment grands pour contenir au moins numRows de données'. Maintenant, une seule méthode: récupérez les 405 premières lignes, puis récupérez la dernière ligne 800000 par la récupération de tableau. – ruuut

Répondre

0

Sur la 8ème itération de la boucle while, size était 10000 et getNumArrayRows() renvoyait un entier compris entre 1 et 10000. Il n'y avait plus de lignes et c'est pourquoi il n'y avait pas de 9ème itération. Sur la 8ème itération, votre boucle for a imprimé 0 ou plusieurs lignes à partir de la 7ème itération. La façon dont vous rédigez votre message, vous vous attendez à ce que le lecteur renvoie 80405 lignes. Mais sauf si vous avez trouvé un nouveau bogue dans l'ODP, la requête réelle pour le lecteur a renvoyé entre 70001 et 80000 lignes. Par exemple, si la requête du lecteur a renvoyé 79999 lignes, votre code a imprimé les lignes 1 à 70000, puis les lignes 70001 à 79999, puis la ligne 70000 à nouveau. Il a de nouveau imprimé la ligne 70000 car le lecteur n'a pas défini la mémoire pour les derniers éléments des tableaux respectifs et votre itérateur de boucle for ne s'est pas arrêté après avoir traité la dernière ligne récupérée. En d'autres termes, pour cet exemple, sur les 7 premières itérations de la boucle while getNumArrayRows() a renvoyé 10000 et sur la 8ème itération, elle a renvoyé 9999.