4

std::vector我们正在通过 OCCI将数据从 CLOB 读入。简化的代码如下所示:

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 Enterprise Edition Release 12.1.0.2.0 - 64bit”。

欢迎对该主题进行任何澄清。

4

1 回答 1

2

我怀疑您的 CLOB 中有多字节字符。

根据文档clob.length() “返回”中的字符数,CLOB参数buffsizeclob.read()状态是“有效值是大于或等于amt的数字,这反过来又说它是“要读取的字节数”。

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

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

或者,如果您有多字节字符并且不需要进行任何字符表示(不知道),那么可能值得使用 BLOB 来代替;blob.length()返回字节数

于 2015-07-25T13:00:59.887 回答