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