2017-04-19 52 views
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; 
} 

數據庫

enter image description here

回答

0

這不是關於行,但有關列寬。從數據庫中獲取的某些值有7個以上的值。 9個字節。

+0

當您閱讀有關錯誤代碼是的文檔是的,但我不明白這是這種情況:首先,我知道一個事實,即檢索到的字符串不超過6分鐘。 8個字符。其次,當緩衝區較長時,使用相同的緩衝區寬度可以正常工作。 – user2672165

+0

嘗試在SQL Developer中執行查詢並在兩列上使用函數轉儲。 7個字節可能與7個字符不同。此外,字符集轉換在客戶端實現,無論我們的應用程序的字符集是什麼,您都會收到以db的本地字符集編碼的字符串。只要確保將兩列寬度乘以4(每個unicode字符4個字節)即可。 – ibre5041

+0

是的,你是對的。數據庫中的數據不正確,我會確保數據適合緩衝區。 – user2672165

相關問題