Pet*_*ing 5 c++ oracle clob occi oracle12c
我们正在将数据从 CLOB 读取到std::vectorvia OCCI 中。简化的代码如下所示:
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 );
Run Code Online (Sandbox Code Playgroud)
这会产生错误 ORA-32116,表示缓冲区大小(读取的第三个参数)应等于或大于要读取的数据量(读取的第一个参数)。这个条件显然是成立的。
将缓冲区大小增加到 4*len 后:
unsigned have_read = clob.read(len , result.data() , 4 * len);
Run Code Online (Sandbox Code Playgroud)
操作执行正确。have_read到目前为止,和的值len始终相同。
缓冲区是否需要未记录的额外空间?还是需要完整的页面?
我们使用“Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64位”。
欢迎对该主题进行任何澄清。
我怀疑你的 CLOB 中有多字节字符。
根据文档“返回”clob.length() 中的字符数CLOB,而buffsize参数clob.read()声明“有效值是大于或等于amt”的数字,这反过来又表示它是“要读取的字节数”。
换句话说(根据文档),您将字符数传递给clob.read()它期望的字节数。您收到错误的事实表明前者比后者小。
文档建议将缓冲区更改为 a utext,在设置字符集后通过setCharSetId()将修复它。
或者,如果您有多字节字符并且不需要进行任何字符表示(不知道),那么可能值得使用 BLOB;blob.length()返回字节数。
| 归档时间: |
|
| 查看次数: |
1023 次 |
| 最近记录: |