Если вы превышаете ограничение на число символов для listagg
, то, как вы справитесь с этим, зависит от того, что вы хотите отобразить.
Если вы используете 12.2, вы можете использовать условие сокращения переполнения для обрезки символов, которые превышают ограничение.
select hcf_date, hcf_type_1, hcf_type_2,
listagg ( id, ','
on overflow truncate
) within group (
order by id
) csv
from hcf
group by hcf_date, hcf_type_1, hcf_type_2;
HCF_DATE HCF_TYPE_1 HCF_TYPE_2 CSV
27-FEB-2018 00:00:00 1 1 272
28-FEB-2018 00:00:00 5 1 283
28-FEB-2018 00:00:00 15 2 279,280
Если вы используете 12.1, есть некоторыедругие обходные пути .
Вы можете использовать сопоставление с образцом строки (match_recognize), чтобы найти длину CSV для каждой дополнительной строки.И верните те, которые находятся в пределах строки:
Я добавил пару дополнительных строк и установил ограничение на 10 символов, чтобы показать принцип:
insert into hcf values ( 281, to_date('28/02/18', 'dd/mm/yy'), 15, 2);
insert into hcf values ( 282, to_date('28/02/18', 'dd/mm/yy'), 15, 2);
with grps as (
select *
from hcf match_recognize (
partition by hcf_date, hcf_type_1, hcf_type_2
order by id
measures
sum(lengthb(s.id) + lengthb(';')) as len
all rows per match
after match skip past last row
pattern (s+)
define
s as 1=1
)
)
select hcf_date, hcf_type_1, hcf_type_2,
listagg ( id, ',' )
within group (
order by id
) csv
from grps
where len <= 10
group by hcf_date, hcf_type_1, hcf_type_2;
HCF_DATE HCF_TYPE_1 HCF_TYPE_2 CSV
27-FEB-2018 00:00:00 1 1 272
28-FEB-2018 00:00:00 5 1 283
28-FEB-2018 00:00:00 15 2 279,280
Или вы можете разбить строкина отдельные группы, когда вы достигнете предела персонажа.И покажите их как отдельные CSV:
with grps as (
select *
from hcf match_recognize (
partition by hcf_date, hcf_type_1, hcf_type_2
order by id
measures
match_number() as grp
all rows per match
after match skip past last row
pattern (s csv*)
define csv as
lengthb(s.id) + sum(lengthb(csv.id) + lengthb(';')) < = 10
)
)
select hcf_date, hcf_type_1, hcf_type_2,
listagg ( id, ',' )
within group (
order by id
) csv
from grps
group by hcf_date, hcf_type_1, hcf_type_2, grp;
HCF_DATE HCF_TYPE_1 HCF_TYPE_2 CSV
27-FEB-2018 00:00:00 1 1 272
28-FEB-2018 00:00:00 5 1 283
28-FEB-2018 00:00:00 15 2 279,280
28-FEB-2018 00:00:00 15 2 281,282
Если вы хотите вернуть весь список CSV длиннее, чем предел varchar2
, вам нужно вернуть clob
.Что вы можете сделать с XML:
select hcf_date, hcf_type_1, hcf_type_2,
substr (
xmlcast (
xmlagg (
xmlelement(s, ',' || id)
order by id
) as clob
), 2
) csv
from hcf
group by hcf_date, hcf_type_1, hcf_type_2;
HCF_DATE HCF_TYPE_1 HCF_TYPE_2 CSV
27-FEB-2018 00:00:00 1 1 272
28-FEB-2018 00:00:00 5 1 283
28-FEB-2018 00:00:00 15 2 279,280,281,282