在Oracle OCCI / OCI中,读取LOB的缓冲区应该大于实际数据吗?获得ORA-32116

时间:2015-07-09 10:03:43

标签: c++ oracle clob oracle12c occi

我们正在通过OCCI将数据从CLOB读入std::vector。简化代码如下:

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,表示缓冲区大小(读​​取的第三个参数)应该等于或大于要读取的数据量(读取的第一个参数)。这种情况显然已经存在。

将缓冲区大小增加到4 * len:

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

正确执行操作。到目前为止,have_readlen的值始终相同。

缓冲区是否需要未记录的额外空间?或者需要完整的页面?

我们正在使用“Oracle Database 12c企业版12.1.0.2.0版 - 64位”。

欢迎任何有关该主题的澄清。

1 个答案:

答案 0 :(得分:2)

我怀疑你的CLOB中有多字节字符。

根据文档clob.length() "returns the number of characters in the CLOB"buffsize clob.read()参数指出"valid values are numbers greater or equal to amt",而setCharSetId()则表示它是“要读取的字节数。“

换句话说(并且根据文档)当你期望字节数时,你将字符数传递给clob.read()。您收到错误的事实表明前者比后者小。

文档建议将缓冲区更改为utext,在通过blob.length() returns the number of bytes设置字符集后会修复它。

或者,如果你有多字节字符并且不需要做任何字符表示(不知道),那么使用BLOB代替它可能是值得的; http://developer.android.com/guide/appendix/media-formats.html#core