Я использую setDataBuffer для извлечения строк, возвращаемых хранимой процедурой, через курсор, поскольку setPrefetchRowCount в этом случае, похоже, не работает. Использование setDataBuffer хорошо работает, когда размер буфера превышает общее количество возвращаемых строк. В моем случае я проверил, что буфер может содержать 5000 строк, а количество возвращаемых строк равно 538. Когда я уменьшаю длину буфера до 100 (max_numrows=100 ниже), он работает с первыми тремя вызовами next(max_numrows) и дает точно тот же результат, что и при большом буфере. Однако при четвертом вызове я получаю исключение ORA-01406: значение извлеченного столбца было усечено. Что происходит и как я могу решить проблему?
static const size_t max_numrows=5000;
char var_buf[max_numrows][7];
char sym_buf[max_numrows][9];
rs->setDataBuffer(1,var_buf,oracle::occi::OCCI_SQLT_STR,sizeof(var_buf[0]),(ub2*)0);
rs->setDataBuffer(2,sym_buf,oracle::occi::OCCI_SQLT_STR,sizeof(sym_buf[0]),(ub2*)0);
sym.resize(var.size());
size_t fetch_count=0;
while(rs->next(max_numrows)==ResultSet::DATA_AVAILABLE)
{
for(size_t i=0;i<rs->getNumArrayRows();++i)
{
var[fetch_count*max_numrows+i]=var_buf[i];
sym[fetch_count*max_numrows+i]=sym_buf[i];
}
++fetch_count;
}
База данных