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.
S'il vous plaît poster quelques exemples de données et la partie pertinente de votre code – Aleksej
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 –