как использовать setDataBuffer из OCCI для выборки массива

У меня есть запрос, который я выполняю в базе данных, которая возвращает массив записей, я прочитал в документации Oracle OCCI, что вы должны использовать ResultSet::setDataBuffer() для извлечения массива данных из базы данных.

Я просто не понимаю, что я должен указать в качестве первых двух аргументов, когда строка базы данных содержит несколько столбцов с разными данными? Какой тип я должен указать в качестве типа буфера?

//example, does not contain all parts, just enough to demonstrate my point
    SELECT AGE, BIRTHDATE, NAME FROM PEOPLE;
    int i[10];  // Type of buffer??? Age is int, but name is a string?
    ResultSet* res;
    res->setDataBuffer(1 /*col index of first col in select statement*/, &i[0], OCCIINT, 10 * sizeof(int));

while(res->next()) { //Fetch data...}

До сих пор я тщетно искал примеры в Google. Я надеюсь, что кто-то здесь может помочь?


person Tony The Lion    schedule 06.04.2011    source источник
comment
Есть ли причина, по которой вы не используете функции OCCI::ResultSet getString(), getInt(),... и т.д.? Каковы типы данных столбцов вашей базы данных AGE, BIRTHDAY или NAME? Я предполагаю, что это простые числа, vchars и т. Д. Или нет? Я мог бы привести пример с использованием вышеупомянутых методов, если это поможет.   -  person nabulke    schedule 06.04.2011
comment
@nabulke, это то, что я сделал изначально, однако кажется, что он не извлекает все записи, он проходит цикл несколько раз, каждый раз извлекая одну и ту же запись. Но да, если вы приведете пример, возможно, я сделал что-то не так.   -  person Tony The Lion    schedule 06.04.2011


Ответы (1)


Согласно нашим комментариям, я привожу простой пример с использованием функций getString(),...:

// Statement -> stmt
// ResultSet -> res
// Connection -> con

// pseudo code ahead !

stmt = con->createStatement(MY_SELECT, MY_TAG);
stmt->setPrefetchRowCount(NUMBER_OF_PREFETCHES); // enable bulk collect
res = stmt->executeQuery();

while(res->next())
{
    date = res->getDate(INDEX_OF_DATE);
    age = res->getInt(INDEX_OF_AGE);
    name = res->getString(INDEX_OF_NAME);

    // do something with date, age, name...
}

stmt->closeResultSet(res);
con->terminateStatement(stmt);

Но я предполагаю, что это именно то, что вы изначально делали?

person nabulke    schedule 06.04.2011
comment
что, если число строк, которое нужно извлечь, неизвестно до его извлечения? - person Tony The Lion; 06.04.2011
comment
количество строк почти всегда неизвестно перед выборкой. вы просто перебираете все возвращаемые строки. Зачем вам нужно количество строк перед запросом? Вы можете выделить необходимые ресурсы внутри цикла while. - person nabulke; 06.04.2011
comment
так что тогда должно быть NUMBER_OF_PREFETCHES? - person Tony The Lion; 06.04.2011
comment
Это как раз то количество строк, которое occi должен извлекать из базы данных за один раз, чтобы уменьшить круговые обращения. Так что это своего рода оптимизация, которая не имеет ничего общего с фактическим количеством строк, возвращаемых в сумме. Пример должен работать без setPrefetchStatement. - person nabulke; 06.04.2011