2015-10-16 4 views
0

У меня есть проблема, которую я не могу решить. У меня это заявление:oracle listagg - результат конкатенации строки слишком длинный

SELECT account, 
    listagg(field1 || ', ') WITHIN 
GROUP (
     ORDER BY field1 
     ) AS field1 
FROM TABLE1 
GROUP BY account 

Я получаю сообщение об ошибке:

ORA-01489: result of string concatenation is too long 01489. 00000 - "result of string concatenation is too long" *Cause: String concatenation result is more than the maximum size. *Action: Make sure that the result is less than the maximum size.

Как решить? Я пытался это сделать, но это не помогло

SUBSTR(listagg(field1 || ', ') WITHIN 
GROUP (
     ORDER BY field1 
     ), 1, 500) AS field1 
+0

Если конкатенация слишком длинная, то не было бы очевидным решением усечь ее? –

ответ

1

Результатов функций SQL возвращающих строки должны соответствовать в пределах максимального предела, который был 4000 (теперь 32K в Oracle 12c, если max_string_size=extended).

Вы не можете усечь его с SUBSTR, потому что к тому времени уже слишком поздно - это сама функция LISTAGG, которая поднимает исключение.

Единственный способ обойти это, чтобы гарантировать, что количество записей которые сцепляются ограничено - например, поставив максимальную крышку на количество возвращаемых записей для каждого account, и/или путем усечения длину каждого field1 сам.

+1

Или используйте 'XMLAGG'. –

+0

@Lalit, спасибо, что это правильно, просто потребуются некоторые изменения в приложении. –

Смежные вопросы