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

标签 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,表示缓冲区大小(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/

相关文章:

c++ - 在 C/C++ 中连接字符串

c++ - 数组 [] 运算符返回一个引用,那么如何更改它的值呢?

c++ - 如何在 Matlab 2016b 中导入 Eigen C++ 库?

sql - Oracle中的标识符太长

java - Teradata createClob : function not supported in this version. 这是错误还是功能?

c++ - 在 Windows 中等待 std::atomic<int> 的正确方法?

oracle - 我可以编写一个行为类似于 REGEXP_LIKE 的函数,即其结果类型表现为 bool 值吗?

mysql - SUM 列值与 group by aggregate 处理空值

oracle - CLOB的长度是0?

java - 如何将 byte[] 保存为 java.sql.Clob?