我们正在通过 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,表示缓冲区大小(read 的第 3 个参数)应该等于或大于要读取的数据量(read 的第 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”。
欢迎就此主题进行任何澄清。
最佳答案
我怀疑您的 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()
。您收到错误的事实表明前者小于后者。
文档建议在通过 setCharSetId()
设置字符集后将缓冲区更改为 utext
会修复它。
或者,如果您有多字节字符并且不需要进行任何字符表示(不知道),那么使用 BLOB 可能是值得的; blob.length()
returns the number of bytes .
关于c++ - 在 Oracle OCCI/OCI 中,读取 LOB 的缓冲区是否应该大于实际数据?获取 ORA-32116,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31314287/