0

我正在使用 setDataBuffer 通过游标检索从存储过程返回的行,因为 setPrefetchRowCount 在这种情况下似乎不起作用。当缓冲区大于返回的总行数时,使用 setDataBuffer 效果很好。在我的情况下,我测试了缓冲区可以容纳 5000 行,返回的行数为 538。当我将缓冲区减少到 100 的长度(max_numrows=100 以下)时,它会在前三个调用 next(max_numrows) 并准确给出与缓冲区很大时的结果相同。但是,在第四次调用时,我得到了异常 ORA-01406: fetched column value was truncated。发生了什么事,我该如何解决这个问题?

static const size_t max_numrows=5000;
char var_buf[max_numrows][7];
char sym_buf[max_numrows][9];
rs->setDataBuffer(1,var_buf,oracle::occi::OCCI_SQLT_STR,sizeof(var_buf[0]),(ub2*)0);
rs->setDataBuffer(2,sym_buf,oracle::occi::OCCI_SQLT_STR,sizeof(sym_buf[0]),(ub2*)0);
sym.resize(var.size());
size_t fetch_count=0;
while(rs->next(max_numrows)==ResultSet::DATA_AVAILABLE)
{
    for(size_t i=0;i<rs->getNumArrayRows();++i)
    {
        var[fetch_count*max_numrows+i]=var_buf[i];
        sym[fetch_count*max_numrows+i]=sym_buf[i];
    }
    ++fetch_count;
}

数据库

在此处输入图像描述

4

1 回答 1

0

这不是关于行,而是关于列宽。从数据库中获取的一些值有超过 7 个。9 个字节。

于 2017-04-19T14:46:37.303 回答