今天在系统中测试导出报表的时候,根据人名、工号、单据号、项目等条件分别导出都没有出现问题,唯独无条件导出时报以下错误:
Oracle 错误:ORA-22922 不存在的 LOB 值
根据报错信息进行排查,发现是这句SQL出现了问题
to_char(wm_concat(distinct('字段名'))) as 字段名
直接无条件查询会报错,加上where 1=1 order by ***可以通过,但是这样又会导致查询条件置于这句order by之后导致报错ORA-00933: SQL 命令未正确结束
所以只能对这句SQL开刀。
网上推荐的方法是使用listagg()函数替代wm_concat()函数,但是这样做必须有个within group (order by ‘字段’)的前提条件。我实际查询的字段使用了distinct去重,这就导致这句SQL不满足这个前提条件。
我使用的方式是:
交换to_char()和wm_concat()函数顺序,然后在最外层的查询字段再加上to_char()。
修改如下:
SELECT ...,
TO_CHAR(T.DISTINCT_TYPE_NAME) AS DISTINCT_TYPE_NAME,
... FROM ...
LEFT JOIN (SELECT ...,
wm_concat(distinct(TO_CHAR(D1.DICT_NAME))) AS DISTINCT_TYPE_NAME,
...)T
ON ...
测试通过,完美解决问题。