0
我使用setDataBuffer來檢索通過遊標從存儲過程返回的行,因爲setPrefetchRowCount在這種情況下似乎不起作用。 當緩衝區大於返回行的總數時,使用setDataBuffer可以很好地工作。在我的情況下,我測試了緩衝區可以容納5000行,返回的行數是538.當我將緩衝區減少到100(max_numrows = 100以下)時,它將前三次調用(next_numrows)並給出與緩衝區較大時的結果相同。但是,在第四次調用中,我得到異常ORA-01406:提取列值被截斷。 怎麼回事,我該如何解決這個問題?Oracle OCCI setDataBuffer導致ORA-01406:提取的列值被截尾
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;
}
數據庫
當您閱讀有關錯誤代碼是的文檔是的,但我不明白這是這種情況:首先,我知道一個事實,即檢索到的字符串不超過6分鐘。 8個字符。其次,當緩衝區較長時,使用相同的緩衝區寬度可以正常工作。 – user2672165
嘗試在SQL Developer中執行查詢並在兩列上使用函數轉儲。 7個字節可能與7個字符不同。此外,字符集轉換在客戶端實現,無論我們的應用程序的字符集是什麼,您都會收到以db的本地字符集編碼的字符串。只要確保將兩列寬度乘以4(每個unicode字符4個字節)即可。 – ibre5041
是的,你是對的。數據庫中的數據不正確,我會確保數據適合緩衝區。 – user2672165