Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / listagg ограничения числа конкатинируемых строк / 8 сообщений из 8, страница 1 из 1
22.06.2021, 11:05
    #40079286
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
Добрый день, скажите как можно избежать переполнения, делаю так, но может есть способ полегче?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH sample_data AS (SELECT 1 ID, 'a' val FROM dual UNION ALL
                     SELECT 1 ID, 'b' val FROM dual UNION ALL
                     SELECT 1 ID, 'c' val FROM dual UNION ALL
                     SELECT 2 ID, 'd' val FROM dual UNION ALL
                     SELECT 2 ID, 'e' val FROM dual UNION ALL
                     SELECT 2 ID, 'f' val FROM dual UNION ALL
                     SELECT 2 ID, 'g' val FROM dual UNION ALL
                     SELECT 3 ID, 'h' val FROM dual UNION ALL
                     SELECT 3 ID, 'i' val FROM dual UNION ALL
                     SELECT 3 ID, 'h' val FROM dual UNION ALL
                     SELECT 3 ID, 'j' val FROM dual UNION ALL
                     SELECT 3 ID, 'k' val FROM dual UNION ALL
                     SELECT 4 ID, 'l' val FROM dual UNION ALL
                     SELECT 4 ID, 'm' val FROM dual UNION ALL
                     SELECT 5 ID, 'n' val FROM dual)
SELECT ID,
       listagg(CASE WHEN rn <= 3 THEN val END, ',') WITHIN GROUP (ORDER BY val) vals
FROM   (SELECT ID,
               val,
               row_number() OVER (PARTITION BY ID ORDER BY val) rn
        FROM   sample_data)
GROUP BY ID;
...
Рейтинг: 0 / 0
22.06.2021, 12:10
    #40079305
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
wsnet,

Какая версия Oracle? В последних версиях есть overflow_clause.
...
Рейтинг: 0 / 0
22.06.2021, 14:15
    #40079344
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
AmKad, 11 версия
...
Рейтинг: 0 / 0
22.06.2021, 14:27
    #40079346
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
wsnet
может есть способ полегче?
Для 11-ой версии есть способ посложнее: считаешь аналитикой нарастающую сумму длин строк и перестаешь агрегировать аккурат до переполнения. Либо забиыть про переполнение и получать clob через xmlagg.
...
Рейтинг: 0 / 0
22.06.2021, 14:35
    #40079351
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
wsnet
Добрый день, скажите как можно избежать переполнения


Избежать обрезанием или получить весь результат? Если получить весь результат, то

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
WITH sample_data AS (SELECT 1 ID, 'a' val FROM dual UNION ALL
                     SELECT 1 ID, 'b' val FROM dual UNION ALL
                     SELECT 1 ID, 'c' val FROM dual UNION ALL
                     SELECT 2 ID, 'd' val FROM dual UNION ALL
                     SELECT 2 ID, 'e' val FROM dual UNION ALL
                     SELECT 2 ID, 'f' val FROM dual UNION ALL
                     SELECT 2 ID, 'g' val FROM dual UNION ALL
                     SELECT 3 ID, 'h' val FROM dual UNION ALL
                     SELECT 3 ID, 'i' val FROM dual UNION ALL
                     SELECT 3 ID, 'h' val FROM dual UNION ALL
                     SELECT 3 ID, 'j' val FROM dual UNION ALL
                     SELECT 3 ID, 'k' val FROM dual UNION ALL
                     SELECT 4 ID, 'l' val FROM dual UNION ALL
                     SELECT 4 ID, 'm' val FROM dual UNION ALL
                     SELECT 5 ID, 'n' val FROM dual)
select  substr(xmlcast(xmlagg(xmlelement(e,',' || val) order by val) as clob),2) vals
  from  sample_data
  group by id
/

VALS
--------------------------------------------------------------------------------
a,b,c
d,e,f,g
h,h,i,j,k
l,m
n

SQL>



SY.
...
Рейтинг: 0 / 0
23.06.2021, 15:02
    #40079601
wsnet
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
SY, а обрезать как лучше?
...
Рейтинг: 0 / 0
23.06.2021, 15:44
    #40079616
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
wsnet
а обрезать как лучше?


По 4000 байт или по элементам влезающим в 4000 байт?

По элементам:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
           select  id,
                   val,
                   sum(lengthb(val || ',')) over(partition by id order by val rows between unbounded preceding and current row) - 1 lb
             from  sample_data
          )
select  listagg(val,',') within group(order by val) limit_by_val
  from  t
  where lb <= 4000
  group by id
/



SY.
...
Рейтинг: 0 / 0
23.06.2021, 16:45
    #40079639
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
listagg ограничения числа конкатинируемых строк
Лучше вообще не обрезать: получать на клиенте как есть и склеивать там. В Дельфи строки
подлиннее чем у Оракла будут...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / listagg ограничения числа конкатинируемых строк / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]