【說明】:一般提示此類錯誤說明在取大類型字段時(如:clob)進行了類型轉換或者數據截取(如:to_char,substr等),
而轉換列的數據值為NULL。
【解決】:我遇到的這個問題的使用原因在於使用了WM_CONCAT(列轉行)函數時數據字段過長,只想截取保留部分長度。
那么這時是不能使用to_char函數的,因為to_char和WM_CONCAT分配的內存大小不一致,也會報類似的錯誤。
此時改用了DBMS_LOB.SUBSTR函數,問題還未解決。
問題發生在SQL做了嵌套,這時DBMS_LOB.SUBSTR函數一定要寫在最外層。
【總結】:1、如果使用了to_char函數時,只有在字符串長度超過4000時才會顯露問題,很難查。
2、WM_CONCAT行轉列時數據為NULL時,問題才暴露出來。
【例子】:SELECT A.* FROM (SELECT DBMS_LOB.SUBSTR(WM_CONCAT(B.F1),2000,1) FF1,
DBMS_LOB.SUBSTR(WM_CONCAT(DISTINCT B.F2),2000,1) FF2 FROM B)A;
改成
SELECT DBMS_LOB.SUBSTR(A.FF1,2000,1) F1,DBMS_LOB.SUBSTR(A.FF2,2000,1) F2
FROM (SELECT WM_CONCAT(B.F1) FF1,WM_CONCAT(DISTINCT B.F2)FF2 FROM B)A;