zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    verilog学习(9)实战之存储器&奇偶校验
    求职经验之综合岗位三面
    求职经验之综合岗位二面
    求职经验之综合岗位
    verilog学习(8)实战之PPL与串行/解串器
    verilog学习(7)实战之扫描链
    verilog学习(6)实战4之触发器与锁存器
    verilog学习(5)实战3之计数器与bus
    verilog学习(4)实战1之基础练习
    求职经验之器件与芯片岗
  • 原文地址:https://www.cnblogs.com/wsxdev/p/15416946.html
Copyright © 2011-2022 走看看