Oracle 12c: функция listagg не распознает предложение о переполнении при попытке использования в SQLdeveloper

Я пытаюсь использовать функцию listagg () для создания списка URL-адресов документов, разделенных запятыми, и это вызывает ошибку ORA-01489 - слишком длинная конкатенация строк. Поэтому я попытался исправить это, вставив предложение о переполнении, как в следующем фрагменте:

  select distinct
    wo_id,
    listagg(document_id, ',' ON OVERFLOW TRUNCATE WITH COUNT) 
      within group (order by wo_id) over (partition by wo_id) as document_ids
  from
  (
    <...inner SELECT result set...>
  )

... но когда я пытаюсь запустить инструкцию SQL, я получаю ошибку отсутствия правой круглой скобки ORA-00907 - по-видимому, потому, что SQLdeveloper не ожидает увидеть ключевое слово on внутри первого набора круглых скобок. Однако все мои поисковые запросы в Google показывают, что мой синтаксис верен. Может ли кто-нибудь заметить, что я делаю неправильно?


person Ken L    schedule 28.10.2020    source источник
comment
@GMB - Похоже, это именно то, что доктор прописал, теперь все работает - спасибо! :-)   -  person Ken L    schedule 29.10.2020


Ответы (1)


Я подозреваю, что вы используете Oracle ‹12.2, где предложение on overflow недоступно. Альтернативой является использование кумулятивного sum() длины строк в байтах и ​​использование этого для ограничения вывода:

select wo_id, 
    listagg(document_id) within group (order by id) document_ids
from (
    select t.*, sum(lengthb(document_id)) over(partitionb by wo_id order by id) sum_len
    from mytable t
) t
where sum_lengthb < 4000
group by wo_id

Примечания:

  • чтобы это имело смысл, вам нужен упорядочивающий coumn, отличный от столбца разделения; Я предположил id

  • Я изменил внешний запрос на запрос агрегирования; по-видимому, это ваше настоящее намерение, а не агрегирование окон и distinct

person GMB    schedule 28.10.2020