2012-12-11 402 views
3

是否有一個方法來獲取基於CLOB字段的字節數的子字符串?DBMS_LOB.SUBSTR()拋出「字符串緩衝區太小」錯誤

select DBMS_LOB.SUBSTR(a.COMMENTS, 3998, 1) 
FROM FOO; 

我得到錯誤:

"ORA-06502: PL/SQL: numeric or value error: character string buffer too small"

。 問題出在特殊字符。每個新的特殊字符需要8個字節,所以當我將字符串限制減少到3992時,它就起作用了。

DBMS_LOB.SUBSTR(a.COMMENTS, 3992, 1) works. 

爲了測試的目的,我放了許多特殊字符,並再次拋出相同的錯誤。

是否有任何方法找到基於字節數的字符串比字符數?

實際上,我們從表格中提取數據,需要在界面上顯示4000個字符的限制。所以,我們只想獲取前4000個字符。由於字符大小爲1個字節,我們可以容納4000個字節。所以,如果我們使用DBMS_LOB.CONVERTTOBLOB,我們可能無法正確顯示提取的字符串。我們可以將它轉換回來嗎?

+0

根據[文檔](http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_lob.htm#i999349 )你可以指定你正在使用的字符集... – Ben

+0

@Jyotirup你有沒有想過這個? – n00b

回答

0

試試這個方法::

使用Oracle功能LENGTHB()得到這個結果。有一個辦法解決使用DBMS_LOB.CONVERTTOBLOB轉換CLOBBLOB和使用DBMS_LOB.GET_LENGTH()。這將返回字節數。

您可以使用此線程完整的答案:: https://forums.oracle.com/forums/thread.jspa?threadID=2133623

+0

實際上,我們正在從表格中提取數據,並且需要在界面上顯示4000個字符的限制。所以,我們只想獲取前4000個字符。由於字符大小爲1個字節,我們可以容納4000個字節。因此,如果我們使用DBMS_LOB.CONVERTTOBLOB,我們可能無法正確顯示提取的字符串。我們可以將它轉換回來嗎? – Jyotirup

2

我成功地運用了老SUBSTR函數,它的工作原理爲clob類型以及。在這種情況下,它是SUBSTR(a.COMMENTS,1,3992)

+0

對於'CLOB'函數'DBMS_LOB.SUBSTR'應該被使用。 'SUBSTR'在'CLOBS'上執行速度要慢得多。 – rpozarickij

+2

DBMS_LOB.SUBSTR不斷爲我拋出錯誤。然而,SUBSTR工作。 – Mocking

+0

SUBSTR()對我也很好,謝謝你的提示。 *還有值得注意的是,當我的SELECT有一個DISTINCT子句時,我只有這個錯誤。如果我能擺脫這一點,錯誤也消失了。我希望3小時前我能想出來! – StewS2

相關問題