【问题标题】:ORA-00932 inconsistent datatypes from collect callORA-00932 来自对方付费电话的不一致数据类型
【发布时间】:2016-04-29 14:50:26
【问题描述】:

当我能够使用cast(collect(value) as DBMSOUTPUT_LINESARRAY) 将结果汇总到一行中时,我感到非常高兴,如下例所示:

select site, lote, material, cast(collect(value) as DBMSOUTPUT_LINESARRAY) AS valueagg
from table1
GROUP BY site, lote, material, status;

SITE   LOTE    MA VALUEAGG
------ ------- -- ----------------------------------------------------------------------------------
AAKI01 0000443 HW SYS.DBMSOUTPUT_LINESARRAY('9362','10k','1st','USERS','8','100MW','2','V2','CELL')

但是当我尝试对第一个查询的结果进行另一个聚合时,例如 cast(collect(valueagg) as DBMSOUTPUT_LINESARRAY),我得到一个错误,如下例所示:

SELECT site, material, cast(collect(valueagg) as DBMSOUTPUT_LINESARRAY) AS valueagg2
FROM table1_agg -- result of first query
GROUP BY site, material;

Error report -
SQL Error: ORA-00932: inconsistent datatypes: expected - got -
00932. 00000 -  "inconsistent datatypes: expected %s got %s"

我尝试转换为 varchar2,即使它会限制结果 - 我对此并不担心,因为字符串的前 4000 个字符对我来说已经足够了 - 但我无法做到这一点。

【问题讨论】:

  • 请发布一些示例数据和代码的相关部分
  • select site, lote, material, cast(value) as DBMSOUTPUT_LINESARRAY) AS valueagg from (table1) GROUP BY site, lote, material I get AAKI01, 0000443, HW, SYS.DBMSOUTPUT_LINESARRAY(9362 CELL V2 2 100MW 8 USERS 1st 10K) 在这我做 SELECT site, material, cast(collect(valueagg) as DBMSOUTPUT_LINESARRAY) AS valueagg2 FROM table1_agg GROUP BY site, material 我得到错误

标签: sql oracle ora-00932


【解决方案1】:

DBMSOUTPUT_LINESARRAY 是一个 varchar2 的 varray,所以你的第一个查询没问题; collect() 调用获取字符串集合,它可以将其转换为 DBMSOUTPUT_LINESARRAY varray 集合类型。

您的第二个查询正在尝试创建集合的集合。 As the documentation says:

如果 column 本身是一个集合,则 COLLECT 的输出是一个嵌套的集合表。

collect() 调用试图创建的是字符串集合的集合,它与DBMSOUTPUT_LINESARRAY 的类型不同。您可以创建自己的类型来支持它:

create type demo_type as varray(100) of DBMSOUTPUT_LINESARRAY -- or as big as you need
/

然后你可以这样做:

SELECT site, material, cast(collect(valueagg) as DEMO_TYPE) AS valueagg2
FROM table1_agg GROUP BY site, material;

SITE   MA VALUEAGG2
------ -- ---------------------------------------------------------------------------------------------------------
AAKI01 HW MYSCHEMA.DEMO_TYPE(PUBLIC.DBMSOUTPUT_LINESARRAY('9362','10k','1st','USERS','8','100MW','2','V2','CELL'))

或者也许使用不同的lote 值更明显地显示这一点,因此您的第一个查询得到两行:

select site, lote, material, cast(collect(value) as DBMSOUTPUT_LINESARRAY) AS valueagg
from table1 GROUP BY site, lote, material;

SITE   LOTE    MA VALUEAGG
------ ------- -- ----------------------------------------------------------------------------------------------------
AAKI01 0000443 HW SYS.DBMSOUTPUT_LINESARRAY('9362','8','100MW','2','V2','CELL')                                       
AAKI01 0000444 HW SYS.DBMSOUTPUT_LINESARRAY('USERS','10k','1st')

SELECT site, material, cast(collect(valueagg) as DEMO_TYPE) AS valueagg2
FROM table1_agg GROUP BY site, material;

SITE   MA VALUEAGG2
------ -- ---------------------------------------------------------------------------------------------------------------------------------------
AAKI01 HW MYSCHEMA.DEMO_TYPE(PUBLIC.DBMSOUTPUT_LINESARRAY('9362','8','100MW','2','V2','CELL'),PUBLIC.DBMSOUTPUT_LINESARRAY('USERS','10k','1st'))

我不确定这是否真的是您想要的;我怀疑您想要一个包含两个聚合值的值的集合。这意味着取消嵌套并重新组合它们:

SELECT site, material, cast(collect(column_value) as DBMSOUTPUT_LINESARRAY) AS valueagg2
FROM table1_agg CROSS JOIN TABLE(valueagg) v
GROUP BY site, material;

SITE   MA VALUEAGG2
------ -- ----------------------------------------------------------------------------------
AAKI01 HW SYS.DBMSOUTPUT_LINESARRAY('9362','1st','10k','USERS','CELL','V2','2','100MW','8')

返回原始数据并从头开始聚合可能更简单,因为您使用的可变数组类型不能用于多重集操作。

【讨论】:

  • 谢谢伙计。 “创建类型 demo_type 作为 DBMSOUTPUT_LINESARRAY 的 varray(100)”解决了它!并用作 cast(collect(valueagg) as DEMO_TYPE) 非常感谢:-)
猜你喜欢
  • 1970-01-01
  • 2011-06-03
  • 1970-01-01
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 2014-05-31
  • 1970-01-01
  • 2017-12-28
相关资源
最近更新 更多