Oracle OCCI setDataBuffer вызывает ORA-01406: значение извлеченного столбца было усечено

Я использую 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;
}

База данных

введите здесь описание изображения


person user2672165    schedule 19.04.2017    source источник


Ответы (1)


речь идет не о строках, а о ширине столбца. Некоторое значение, полученное из базы данных, имеет более 7 соотв. 9 байт.

person ibre5041    schedule 19.04.2017
comment
Когда вы читаете документацию о коде ошибки, да, но я не вижу, что здесь это так: во-первых, я точно знаю, что извлекаемые строки не длиннее 6 соотв. 8 символов. Во-вторых, он отлично работает, используя ту же ширину буфера, когда буфер длиннее. - person user2672165; 19.04.2017
comment
попробуйте выполнить запрос в SQL Developer и используйте дамп функции для обоих столбцов. 7 байтов могут отличаться от 7 символов. Также на стороне клиента реализовано преобразование кодировки, чтобы независимо от кодировки нашего приложения вы получали строки, закодированные в родной кодировке базы данных. Просто умножьте обе ширины столбца на 4 (4 байта на один символ юникода). - person ibre5041; 19.04.2017
comment
Да вы правы. Данные в базе были неверны, и я прослежу, чтобы данные поместились в буфере. - person user2672165; 20.04.2017