[英]In Oracle OCCI/OCI, should buffer for reading LOBs be larger than actual data? Getting ORA-32116
我們通過OCCI將數據從CLOB讀入std::vector
。 簡化代碼如下所示:
oracle::occi::Clob clob = result.getClob( 3 );
unsigned len = clob.length();
std::vector< unsigned char > result( len );
unsigned have_read = clob.read( len , result.data() , len );
這會產生錯誤ORA-32116,表示緩沖區大小(讀取的第三個參數)應該等於或大於要讀取的數據量(讀取的第一個參數)。 這種情況顯然是持有的。
將緩沖區大小增加到4 * len后:
unsigned have_read = clob.read(len , result.data() , 4 * len);
操作正確執行。 到目前為止, have_read
和len
的值總是相同的。
緩沖區是否需要未記錄的額外空間? 或者需要完整的頁面?
我們使用的是“Oracle Database 12c企業版12.1.0.2.0 - 64位”。
歡迎任何有關該主題的澄清。
我懷疑你的CLOB中有多字節字符。
根據文檔clob.length()
“返回CLOB
的字符數”,而clob.read()
的buffsize
參數聲明“有效值是大於或等於amt
數字” ,這反過來說它是“要讀取的字節數。“
換句話說(並且根據文檔clob.read()
當你期望字節數時,你將字符數傳遞給clob.read()
。 您收到錯誤的事實表明前者小於后者。
文檔建議將緩沖區更改為utext
,在通過setCharSetId()
設置字符集后將修復它。
或者,如果你有多字節字符並且不需要做任何字符表示(不知道),那么使用BLOB代替它可能是值得的; blob.length()
返回字節數 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.