康卡特突然抛出一个错误

时间:2016-10-13 13:45:31

标签: sql oracle

运行此查询后(在我们将Oracle版本更新为g11之前,它完全正常):

SELECT to_char(wm_concat(PRODUCT_CATEGORY_CODE) )  AS COMB , 
       case when   instr( to_char(wm_concat(PRODUCT_CATEGORY_CODE) ), 'T_V') > 0  then 1 else 0  end +
       case when   instr( to_char(wm_concat(PRODUCT_CATEGORY_CODE) ), 'INT') > 0  then 1 else 0  end +
       case when   instr( to_char(wm_concat(PRODUCT_CATEGORY_CODE) ), 'TEL') > 0  then 1 else 0  end category_count 
       ....
FROM ....     

实际的查询非常混乱,我已经设法发现导致此错误的内容(COMB,CATEGORY_COUNT来自上面的查询。)

PRODUCT_CATEGORY_CODEVARCHAR2(3)类型。

我收到了一个错误:

  

ORA-22922:不存在的LOB值

导致此错误的原因是什么以及升级后突然改变的原因?

感谢。

2 个答案:

答案 0 :(得分:1)

我使用LISTAGG()代替WM_CONCAT()设法解决了这个问题:

SELECT to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE))  AS COMB,
       case when   instr( to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE)), 'T_V') > 0  then 1 else 0  end +
       case when   instr( to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE)), 'INT') > 0  then 1 else 0  end +
       case when   instr( to_char(LISTAGG(PRODUCT_CATEGORY_CODE,',') WITHIN GROUP(ORDER BY PRODUCT_CATEGORY_CODE)), 'TEL') > 0  then 1 else 0  end   category_count
FROM ...

但我仍然没有想出为什么 - 问题仍然存在。

答案 1 :(得分:1)

以下是我试图解答为什么会这样的事情。这个答案有多个层次,随着它们越来越深,它们会变得越来越具有推测性。

为什么我的查询停止工作?

查询失败,因为WM_CONCAT是未记录的功能,在新数据库中不可用。

为什么不再可用?

WM_CONCAT在内部使用 作为Oracle Workspace Manager(OWM)的一部分。 OWM是10g和11g的可选组件。某些数据库可能在没有它的情况下安装,或者DBA可能在以后删除它。 Express Edition不存在该选项。并且该功能在Oracle 12c中根本不存在。

很久以前,互联网上有人发现这个功能,认为它很有用,告诉人们,这个想法已经传播开来。但甲骨文从未告诉人们使用它,并且从未保证它不会在某一天消失。那一天到了。

但是......为什么会出现如此受欢迎的功能?!

这是甲骨文公司的态度问题。

如果理论上不需要,那么Oracle不重视那些显而易见的功能。他们等了二十年才创建了一个方便的官方函数来执行世界上每个数据库开发人员一直在做的事情。

您永远需要才能使用WM_CONCAT。您可以使用带有XMLAGG,Oracle数据盒式磁带,MODELCAST(COLLECT...等的黑客攻击。这些都是糟糕的解决方案,但它们确实有效,所以为什么懒惰的开发人员不能只做出独特的解决方案每次你需要解决一个常见的问题?

这种态度让我发疯,我看到了与字符串拆分和布尔类型等简单任务相同的事情。

对于有提示的产品,您认为Oracle开发人员会更好地理解添加有用的功能的想法,即使它们可能在理论上不合理。