1 现象及错误信息
在执行一次查询的过程,Oracle出现ORA-22922:nonexistent LOB value 的错误;根据提示,是在查询时没有找到lob对象;
2 问题分析
查看SQL,发现使用到了wm_concat()函数,而这个函数的返回值类型是LOB对象;
2.1 wm_concat()函数介绍:
wm_concat()函数是一个列转行函数,可以将一列的多行数据转化为一行数据,例如:
salary ------- 10000 9000 8500
经过wm_concat()函数转化过后 select wm_concat(salary) from employee where depno=20; 可以转换成
salary ------- 10000,9000,8500
并且以LOB类型返回
2.2 问题进一步分析
虽然在wm_concat()函数外层包了一层to_char()函数,避免使用了LOB类型;但是由于wm_concat()函数的返回值类型LOB类型是不能进行group by、distinct以及union共存的,因此会偶发ORA-22922:错误。这里需要注意的是,是偶发,不是必然;
3 解决方式
使用listagg(字段A,连接字符) with group(order by 字段A)来替代to_char(wm_concat(字段A))
4 总结
出现这个错误很多时候是使用了wmsys.wm_concat的同时使用了group ,distinct 或者union, 本来两者没有问题,问题在于:
- Oracle Database 10g Enterprise Edition Release 10.2.0.5.0以后的版本wmsys.wm_concat查询出的是LOB类型
- oralce的SQL语句中若查询了LOB字段是不能使用distinct,union,和group by等关键字的。
- 并且在12C 以后,Oracle官方软件不再提供wm_concat函数,因此从兼容性上来看,也不建议使用wm_concat.
参考:https://www.cnblogs.com/halberd-lee/p/13221548.html