2016-04-29 4 views
0

je suis arrivé vraiment heureux quand j'ai pu l'agrégation des résultats en une ligne en utilisant cast(collect(value) as DBMSOUTPUT_LINESARRAY), comme dans cet exemple:ORA-00932 types de données incompatibles de virés

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') 

Mais lorsque je tente une autre agrégation sur les résultats de cette première requête comme cast(collect(valueagg) as DBMSOUTPUT_LINESARRAY) je reçois une erreur, comme dans cet exemple:

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" 

J'ai essayé de convertir en Varchar2 même si elle limiterait le résultat - Je ne suis pas inquiet par cela, comme les 4000 premiers caractères de la chaîne me suffirait - Mais je n'étais pas capable de faire ça. Est un varray de varchar2, de sorte que votre première requête est correcte;

+0

S'il vous plaît poster quelques exemples de données et la partie pertinente de votre code – Aleksej

+0

site choisir, Lote, matériau, coulé (valeur) comme DBMSOUTPUT_LINESARRAY) AS valueagg de ( table1 ) GROUP BY site, Lote, matériel Je reçois AAKI01, 0.000.443, HW, SYS.DBMSOUTPUT_LINESARRAY (9362 CELL V2 2 100MW 8 UTILISATEURS 1er 10K) sur ce que je fais le site SELECT, matériau, coulé (collecte (valueagg) comme DBMSOUTPUT_LINESARRAY) AS valueagg2 dE table1_agg GROUP BY site, matériel et j'obtiens l'erreur –

Répondre

0

DBMSOUTPUT_LINESARRAY l'appel collect() obtient une collection de chaînes, et il peut convertir cela en un type de collection varray DBMSOUTPUT_LINESARRAY.

Votre deuxième requête tente de créer une collection de collections. As the documentation says:

Si la colonne est elle-même une collection, la sortie de COLLECT est une table imbriquée de collections.

Qu'est-ce que cet appel collect() tente de créer est une collection de collections de chaînes, et ce n'est pas du même type que DBMSOUTPUT_LINESARRAY. Vous pouvez créer votre propre type pour soutenir que:

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

Et vous pouvez faire:

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')) 

Ou montrant peut-être que plus évidemment avec différentes lote valeurs afin que votre première requête obtient deux lignes:

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')) 

Je ne suis pas sûr que ce soit vraiment ce que vous voulez; Je suppose que vous voulez une collection unique contenant les valeurs des deux valeurs agrégées. Cela voudrait dire les désimbrication et les recombiner:

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') 

Il est peut-être plus simple de revenir aux données brutes et agrégats à partir de zéro, puisque vous utilisez un type de varray qui ne peut pas être utilisé pour une multiset opération.

+0

Merci l'homme. Le "create type demo_type comme varray (100) de DBMSOUTPUT_LINESARRAY" l'a résolu !!! Et utilisé comme cast (collect (valueagg) comme DEMO_TYPE) Un grand merci :-) –