2016-04-29 10 views
0

私はこの例のように、cast(collect(value) as DBMSOUTPUT_LINESARRAY)を使用して1行で結果を凝集することができたとき、私は本当に幸せだ:コレクトコールからORA-00932一貫性のないデータ型

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の文字として文字列は私のために十分だろう私はこれをすることができませんでした。

+0

( TABLE1 )サイト、LOTE BY GROUPからvalueagg ASいくつかのサンプルデータとDBMSOUTPUT_LINESARRAYとしてあなたのコード – Aleksej

+0

選択サイト、LOTE、材料、キャスト(値)の関連部分)を投稿してください、材料 私が手 私は SELECTサイト、素材、table1_agg FROM valueagg2 ASキャストを(DBMSOUTPUT_LINESARRAYとして(valueagg)を収集)を行う。このオーバー AAKI01、0000443、HW、SYS.DBMSOUTPUT_LINESARRAY(9362 CELLのV2 2 100MW 8 USERS第一10K) GROUP BYサイト、品目 と私はエラーを取得 –

答えて

0

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

2番目のクエリでコレクションのコレクションを作成しようとしています。 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')) 

またはあなたの最初のクエリが2つの行を取得しますので、おそらく異なる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型を使用しているので、ただ、最初から生データと集計に戻る単純かもしれません操作。

+0

ありがとう男。 "DBMSOUTPUT_LINESARRAYのVARRAY(100)として型のdemo_typeを作成する"が解決しました! キャストとして使用(DEMO_TYPEとしてcollect(valueagg)) 多くのありがとう:-) –

関連する問題