我们正在通过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_read
和len
的值始终相同。
缓冲区是否需要未记录的额外空间?或者需要完整的页面?
我们正在使用“Oracle Database 12c企业版12.1.0.2.0版 - 64位”。
欢迎任何有关该主题的澄清。
答案 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