gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:08 24 4
gpt4 key购买 nike

我们正在通过 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_readlen 的值始终相同。

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

我们使用的是“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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com