В Oracle SQL существует обходной путь с использованием XMLAGG вместо LISTAGG, когда результирующий текст будет слишком большим для VARCHAR2 (сообщение об ошибке: ORA-01489 Result of string concat is too large).

Пример с SQL:

LISTAGG(MY_TEXT_SNIPPET) WITHIN GROUP (order by SNIPPET_NO)

обходной путь

RTRIM(XMLAGG(XMLELEMENT(e, MY_TEXT_SNIPPET,'').EXTRACT('//text()') ORDER BY SNIPPET_NO).GetClobVal(),',')

Как бы вы сделали последнее с помощью JOOQ?

Felix Nensa

Ответов: 1

Ответы (1)

Некоторые функции XML поддерживаются начиная с версии jOOQ 3.14, включая:

Но ни EXTRACT(), ни GetClobVal() в таком виде пока не поддерживаются. Попробуйте использовать XMLQUERY() и приводить к CLOB вместо этого.

В качестве альтернативы, как всегда, когда функция, специфичная для конкретного производителя, не поддерживается, можно прибегнуть к использованию шаблонов обычного SQL:

.

Смешивание jOOQ API с шаблонами

.
public static Field listAggWorkaround(Field field, Field orderBy) {
  return rtrim(
    field("{0}.GetClobVal()", SQLDataType.CLOB,
      xmlagg(field("{0}.extract('//text()')", SQLDataType.XML,
        xmlelement("e", field, inline(""))
      )).orderBy(orderBy)
    ),
    inline(",")
  );
}

Использование только шаблонов

public static Field listAggWorkaround(Field field, Field orderBy) {
  return field(
    "rtrim(xmlagg(xmlelement(e,{0},'').extract('//text()') order by {1}).GetClobVal(),','')",
    SQLDataType.CLOB,
    поле, orderBy
  );
}

2022 WebDevInsider