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