给定一个包含许多潜在大字符串的FAT行的表:
create table t (s1 varchar2(4000), ..., sN varchar2(4000))
我知道如何使用直接绑定来获取这些列,即
std::vector<char> buf1(4000, '\0'); OCIDefineByPos(..., 1, &buf1.front(), sb4(buf1.size()), SQLT_CHR, &ind1, &rlen1, 0, OCI_DEFAULT); 每行{ 标准::字符串实际1(buf1.begin(),buf1.begin()+ rlen1); }
这种方法的问题是它需要先验地知道所有列的最大大小(描述也可以告诉我,但这需要更多的工作),而且当每个单元格中包含的数据时,它也会强制预分配许多大缓冲区在实践中要小得多。
我尝试使用分段提取,用 OCI_DYNAMIC_FETCH 替换 OCI_DEFAULT 并使用 OCIDefineDynamic 注册我的回调,并且我确实使用 OCI_FIRST_PIECE 调用,以动态提供缓冲区,但这里再次提供的缓冲区必须足够大,而 OCI 没有提供获取的 varchar2 列的实际大小,正如人们所期望的那样,能够根据需要动态调整缓冲区的大小,或者只接受太短的缓冲区并使用 OCI_NEXT_PIECE 再次给我回电,这样我就可以累积值一块一块地。
现在我系统地得到ORA-01406: fetched column value was truncated
谁能提供一个动态分配的提取缓冲区的例子吗?TIA,--DD