oracle-ORA-22922: 不存在的 LOB 值

 项目进行对于多行数据某个列数据转换为一个字符串查询时,出现【ORA-22922: 不存在的 LOB 值】异常信息,具体异常栈

根据项目信息获取指出调剂列表: ### Error querying database. Cause: java.sql.SQLException: ORA-22922: 不存在的 LOB 值 ### The error may exist in URL [jar:file:/E:/Tomcat/Tomcat%208.5/webapps/czept/WEB-INF/lib/rap-back-czept-3.0.0-SNAPSHOT.jar!/com/ifugle/rap/czept/glzx/xml/CzeptBsdtZctjMapper.xml] ### The error may involve com.ifugle.rap.czept.glzx.mapper.CzeptBsdtZctjMapper.selectCzeptZysjZctjDetailPagination-Inline ### The error occurred while setting parameters ### SQL: select * from ( select row_.*, rownum rownum_ from ( SELECT T.* FROM V_CZEPT_ZCTJ_DETAILS T WHERE T.ID != ? AND T.LX = ? AND INSTR(T.PROGRAMCODE, ?)>0 ) row_ ) where rownum_ <= 20 and rownum_ > 10 ### Cause: java.sql.SQLException: ORA-22922: 不存在的 LOB 值 ; uncategorized SQLException for SQL []; SQL state [99999]; error code [22922]; ORA-22922: 不存在的 LOB 值 ; nested exception is java.sql.SQLException: ORA-22922: 不存在的 LOB 值

奇怪的是,核心查询sql语句为

在pl/sql执行查询时,一点问题都没有,但是一在前后台联调就发生错误!!!!

经过查询得知是:原因是用了wm_concat函数,转换后是clob类型,导致报表查询时报错。

oracle数据库在行转列函数,不但提供了wm_concat函数,也提供了listagg函数!那对该场景查询更换转换方式,把WM_CONCAT(DISTINCT M.XM_DM) AS PROGRAMCODE修改为 LISTAGG(M.XM_DM, ',')WITHIN GROUP (ORDER BY M.XM_DM) AS PROGRAMCODE,再进行执行,问题完美解决!

所以在ORACLE数据库中进行行转列一定注意用法,要不一不小心就进坑!

LISTAGG基础的用法如下:

LISTAGG(列名,分隔符) WITHIN GROUP( ORDER BY 列名)

列名:需要拼接的数据表中的字段

分隔符:以什么字符分割,例如逗号,分号等字符

它的用法就像聚合函数一样,通过Group by语句,把每个Group的一个字段,拼接起来。

总结一下:

  1. wm_cancat函数行转列后,不会按照原有查询结果排序。listagg函数行转列后,会按照原有查询结果顺序排列。
  2.  如果考虑到需要行转列,并且保持分组后顺序不变可以使用listagg来完成。

------------------------------------------------------------------------
作者:超级字节码
来源:CSDN
原文:https://blog.csdn.net/dgxin_605/article/details/110818261
版权声明:本文为博主原创文章,转载请附上博文链接!

------------------------------------------------------------------------

猜你喜欢

转载自blog.csdn.net/dgxin_605/article/details/110818261