ORA-00932 收集调用的数据类型不一致
ORA-00932 inconsistent datatypes from collect call
当我能够使用 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 个字符对我来说就足够了 - 但我无法做到这一点。
DBMSOUTPUT_LINESARRAY
是 varchar2 的 varray,因此您的第一个查询没问题; collect()
调用获取字符串集合,它可以将其转换为 DBMSOUTPUT_LINESARRAY
varray 集合类型。
您的第二个查询正在尝试创建一个集合集合。 As the documentation says:
If column is itself a collection, then the output of COLLECT is a nested table of collections.
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')
返回原始数据并从头开始聚合可能更简单,因为您使用的是不能用于多重集操作的 varray 类型。
当我能够使用 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 个字符对我来说就足够了 - 但我无法做到这一点。
DBMSOUTPUT_LINESARRAY
是 varchar2 的 varray,因此您的第一个查询没问题; collect()
调用获取字符串集合,它可以将其转换为 DBMSOUTPUT_LINESARRAY
varray 集合类型。
您的第二个查询正在尝试创建一个集合集合。 As the documentation says:
If column is itself a collection, then the output of COLLECT is a nested table of collections.
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')
返回原始数据并从头开始聚合可能更简单,因为您使用的是不能用于多重集操作的 varray 类型。