0

cast(collect(value) as DBMSOUTPUT_LINESARRAY)次の例のように、を使用して結果を 1 行にまとめることができたときは、本当にうれしかったです。

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文字で十分なので、心配していません-しかし、これを行うことができませんでした。

4

1 に答える 1

0

DBMSOUTPUT_LINESARRAYは varchar2 の varray であるため、最初のクエリは問題ありません。collect()呼び出しは文字列のコレクションを取得し、それを varray コレクション型にキャストできますDBMSOUTPUT_LINESARRAY

2 番目のクエリは、コレクションのコレクションを作成しようとしています。ドキュメントが言うように

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、最初のクエリが 2 つの行を取得するように、値が異なることをより明確に示している可能性があります。

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 型を使用しているため、生データに戻って最初から集計する方が簡単な場合があります。

于 2016-04-29T17:21:07.007 に答える