ORA-22922:nonexistent LOB value問題及listagg()函式
阿新 • • 發佈:2021-10-17
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