В Oracle OCCI/OCI должен ли буфер для чтения больших объектов быть больше, чем фактические данные? Получение ORA-32116

Мы читаем данные из CLOB в std::vector через OCCI. Упрощенный код выглядит следующим образом:

oracle::occi::Clob clob = result.getClob( 3 );
unsigned len = clob.length();
std::vector< unsigned char > result( len );
unsigned have_read = clob.read( len , result.data() , len );

Это приводит к ошибке ORA-32116, говорящей о том, что размер буфера (3-й аргумент чтения) должен быть равен или больше объема считываемых данных (1-й аргумент чтения). Это условие, по-видимому, выполняется.

После увеличения размера буфера до 4*len:

unsigned have_read = clob.read(len , result.data() , 4 * len);

операция выполнена правильно. До сих пор значения have_read и len всегда были одинаковыми.

Требуется ли недокументированное дополнительное пространство для буфера? Или нужны полные страницы?

Мы используем «Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 — 64bit».

Приветствуются любые разъяснения по теме.


person Peter Gottschling    schedule 09.07.2015    source источник


Ответы (1)


Я подозреваю, что у вас есть многобайтовые символы в вашем CLOB.

Согласно документации clob.length() " возвращает количество символов в CLOB", тогда как параметр buffsize в clob.read() указывает, что "допустимыми значениями являются числа, большие или равные amt", что, в свою очередь, говорит о том, что это "количество байтов, которые нужно прочитать".

Другими словами (и согласно документации) вы передаете количество символов в clob.read(), когда оно ожидает количество байтов. Тот факт, что вы получаете сообщение об ошибке, предполагает, что первое меньше второго.

В документации предлагается изменить буфер на utext после установки набора символов через setCharSetId() исправит это.

В качестве альтернативы, если у вас есть многобайтовые символы и вам не нужно выполнять какое-либо представление символов (без понятия), возможно, вместо этого стоит работать с BLOB; blob.length() возвращает количество байтов.

person Ben    schedule 25.07.2015