• 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

  • 相关阅读:
    python常见报错解释
    selenium键盘操作
    html常用属性,标签,选择器
    模块(三)
    类的继承
    java接口
    java新建文件夹中的绝对路径和相对路径的理解以及中文乱码问题
    Java IO
    JS中的排序算法(-)冒泡排序
    CSS+DIV布局中absolute和relative的区别
  • 原文地址:https://www.cnblogs.com/wsxdev/p/15416946.html
Copyright © 2020-2023  润新知