ORA-22922:nonexistent LOB value問題及listagg()函數


現象及錯誤信息

在執行一次查詢的過程,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, 本來兩者沒有問題,問題在於:

  1. Oracle Database 10g Enterprise Edition Release 10.2.0.5.0以后的版本wmsys.wm_concat查詢出的是LOB類型
  2. oralce的SQL語句中若查詢了LOB字段是不能使用distinct,union,和group by等關鍵字的。
  3. 並且在12C 以后,Oracle官方軟件不再提供wm_concat函數,因此從兼容性上來看,也不建議使用wm_concat.

參考:https://www.cnblogs.com/halberd-lee/p/13221548.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM