Если вы начинаете с существующего массива, вы можете использовать табличное выражение, чтобы получить элементы:
select *
from table (
select
cast(
collect(
'{' ||
'"Id":' || to_char(LKP.Id) || ',' ||
'"descImpuesto":"' || LKP.description ||
'},'
) as sys.DBMSOUTPUT_LINESARRAY
) as ARRAY_LKP
from (
select 1 as id, 'A' as description from dual union all
select 2, 'B' from dual union all
select 3, 'C' from dual union all
select 4, 'D' from dual union all
select 5, 'E' from dual
) LKP
)
/
Result Sequence
---------------------------
{"Id":1,"descImpuesto":"A},
{"Id":2,"descImpuesto":"B},
{"Id":3,"descImpuesto":"C},
{"Id":4,"descImpuesto":"D},
{"Id":5,"descImpuesto":"E},
... и затем объединить их вместе; используя ваш пример в качестве встроенного представления:
select listagg(column_value, null) within group (order by null) AGG_LKP
from table (
select
cast(
collect(
'{' ||
'"Id":' || to_char(LKP.Id) || ',' ||
'"descImpuesto":"' || LKP.description ||
'},'
) as sys.DBMSOUTPUT_LINESARRAY
) as ARRAY_LKP
from (
select 1 as id, 'A' as description from dual union all
select 2, 'B' from dual union all
select 3, 'C' from dual union all
select 4, 'D' from dual union all
select 5, 'E' from dual
) LKP
)
/
AGG_LKP
--------------------------------------------------------------------------------------------------------------------------------------------
{"Id":1,"descImpuesto":"A},{"Id":2,"descImpuesto":"B},{"Id":3,"descImpuesto":"C},{"Id":4,"descImpuesto":"D},{"Id":5,"descImpuesto":"E},
Поскольку в ваших значениях массива есть запятые, окончательная строка заканчивается запятой; Вы можете использовать trim()
, чтобы избавиться от этого, если не хотите этого. Или, если вы можете опустить его из значений массива, вы можете использовать вместо этого разделитель как часть listagg()
(как показано ниже). Так как в вашем примере они все-таки немного искажены, трудно сказать, с чем вы действительно имеете дело.
Если вы только создаете массив для этой цели, вы можете пропустить его и напрямую агрегировать данные:
select
listagg(
'{' ||
'"Id":' || to_char(LKP.Id) || ',' ||
'"descImpuesto":"' || LKP.description ||
'}'
, ',') within group (order by LKP.Id) as AGG_LKP
from (
select 1 as id, 'A' as description from dual union all
select 2, 'B' from dual union all
select 3, 'C' from dual union all
select 4, 'D' from dual union all
select 5, 'E' from dual
) LKP
/
AGG_LKP
--------------------------------------------------------------------------------------------------------------------------------------------
{"Id":1,"descImpuesto":"A},{"Id":2,"descImpuesto":"B},{"Id":3,"descImpuesto":"C},{"Id":4,"descImpuesto":"D},{"Id":5,"descImpuesto":"E}
listagg()
доступен с версии 11g 2.
он не поддерживает более 4000 символов в выводе
Вам необходимо работать с объектами CLOB либо с помощью собственной процедуры создания строки, либо с определяемой пользователем статистической функцией ; или вы можете использовать xmlagg()
:
select rtrim(
xmlcast(xmlagg(xmlelement(e,
'{' ||
'"Id":' || to_char(LKP.Id) || ',' ||
'"descImpuesto":"' || LKP.description ||
'}'
, ',')) as clob), ',') as AGG_LKP
from (
select 1 as id, 'A' as description from dual union all
select 2, 'B' from dual union all
select 3, 'C' from dual union all
select 4, 'D' from dual union all
select 5, 'E' from dual
) LKP
/
AGG_LKP
--------------------------------------------------------------------------------------------------------------------------------------------
{"Id":1,"descImpuesto":"A},{"Id":2,"descImpuesto":"B},{"Id":3,"descImpuesto":"C},{"Id":4,"descImpuesto":"D},{"Id":5,"descImpuesto":"E},
Снова агрегация XML оставляет запятую, которую удаляет вызов rtrim()
.
Это выглядит как будто вы вручную манипулируете данными JSON; Возможно, вы захотите исследовать пакет PL / JSON в качестве альтернативы, поскольку встроенная поддержка JSON не появляется до 12 c.