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

我们通过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);

操作正确执行.到目前为止,has_read和len的值总是相同的.

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

我们使用的是“Oracle Database 12c企业版12.1.0.2.0 – 64位”.

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

最佳答案 我怀疑你的CLOB中有多字节字符.

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

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

文档建议将缓冲区更改为utext,在通过setCharSetId()设置字符集后会修复它.

或者,如果你有多字节字符并且不需要做任何字符表示(不知道),那么使用BLOB代替它可能是值得的; blob.length() returns the number of bytes.

点赞