Oracle OCCI setDataBuffer导致ORA-01406:被截取的列值被截断

时间:2017-04-19 13:10:05

标签: c++ oracle oracle12c occi

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

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;
}

数据库

enter image description here

1 个答案:

答案 0 :(得分:0)

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

相关问题