ORA-22922:nonexistent LOB value错误解决方案
【说明】:一般提示此类错误说明在取大类型字段时(如: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;