4

给定一个包含许多潜在大字符串的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

4

1 回答 1

0

我相信您可以通过获取SQLT_VST而不是SQLT_CHR依赖OCIString来做到这一点。内存分配是在 OCI 内部自动管理的,您实际上会得到一个指向它的指针。OCIStringSize()然后您可以使用and获取实际值的大小malloc()并复制它,或者只是char*通过OCIStringPtr().

于 2012-02-08T19:20:57.193 回答