Как разрешить исключение конкатенации с помощью функции LISTAGG? - PullRequest
0 голосов
/ 16 июня 2020

Привет, я пытаюсь выполнить запрос ниже, в котором используется функция LISTAGG. Запрос дает результат, но когда я пытаюсь извлечь больше записей из сетки или когда я пытаюсь получить количество записей, он дает мне ошибку: ORA-01489: результат конкатенации строк слишком длинный.

Запрос :

 SELECT  sceng_eng_id AS eng_id,
    SUBSTRB(LISTAGG(sceng_pr_eid, ',') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,100) secengs,
    SUBSTR(LISTAGG(sceng_eng_nme, ',') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,256) secengnme
        FROM seceng group by sceng_eng_id

Любая помощь будет очень признательна

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Вы можете предотвратить ошибку, используя ON OVERFLOW TRUNCATE '...', который обрежет полученную строку до того, как будет достигнут предел. Но учтите, что в этом случае он будет обрезан.

SELECT  sceng_eng_id AS eng_id,
    SUBSTRB(LISTAGG(sceng_pr_eid, ','ON OVERFLOW TRUNCATE '...') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,100) secengs,
    SUBSTR(LISTAGG(sceng_eng_nme, ',' ON OVERFLOW TRUNCATE '...') WITHIN GROUP (ORDER BY sceng_eng_id,sceng_pr_eid),1,256) secengnme
        FROM seceng group by sceng_eng_id
0 голосов
/ 16 июня 2020

Это немного длинновато для комментария.

Происходят две вещи. Во-первых, Oracle ограничивает длину строк до 2000 символов. Во-вторых, Oracle часто возвращает строки по мере того, как они становятся доступными, а не генерирует весь набор результатов.

Итак, я подозреваю, что первые несколько строк в порядке - результирующие строки сначала удобно в пределах. Однако, когда движок просматривает данные, он натыкается на неверную строку.

Вы можете узнать, какие значения вызывают это, используя:

select ceng_eng_id AS eng_id, sum(len(sceng_pr_eid) + 1), sum(len(sceng_eng_nme) + 1)
from t
group by ceng_eng_id
having sum(len(sceng_pr_eid) + 1) >= 2000 or 
       sum(len(sceng_eng_nme) + 1) >= 2000;

Неясно, что вы хотите делать; возможно, вы сможете исправить данные или могут быть другие варианты.

...