Преобразование LISTAGG в XMLAGG

У меня есть запрос с использованием функции LISTAGG, которую необходимо преобразовать в XMLAGG, чтобы обработать конкатенацию строк более 4000 символов:

 LISTAGG(NAME || INPUT || DESC || ' ' || '<cm>' || DATA || '</cm>', CHR(13)||CHR(10)) WITHIN GROUP(ORDER BY NAME) AS ENTRIES

Я пробую следующее:

REPLACE(
 REPLACE(
    XMLAGG(
       XMLELEMENT("A",NAME|| INPUT || DESC || ' ' || '<cm>' || DATA || '</cm>', CHR(13)||CHR(10) ORDER BY NAME).getClobaVal(),<A>',''),
   '</A>','[delimiter]') AS ENTRIES

Синтаксическая ошибка при ORDER BY


person user2102665    schedule 18.10.2019    source источник
comment
отсутствуют ) перед ORDER BY и ' => <A>','''   -  person hotfix    schedule 18.10.2019


Ответы (2)


Вы пропустили ) Попробуйте пожалуйста:

XMLAGG(
         XMLELEMENT ("X", FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '<cm>' || MATCH_DATA || '</cm>', CHR(13)||CHR(10)) ORDER BY FIELD_NAME)
person Rustam Pulatov    schedule 18.10.2019
comment
Я пытаюсь с тем же xmlagg. Look может вам помочь: EXTRACT (XMLAGG( XMLELEMENT (X, FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '‹cm›' || MATCH_DATA || '‹/cm›', CHR(13)||CHR (10)) ORDER BY FIELD_NAME), 'X/text()').getstringval() - person Rustam Pulatov; 18.10.2019
comment
исправлена ​​синтаксическая ошибка, но возникла ошибка времени выполнения ORA-00904: SYS.XMLTYPE.GETCLOBAVAL: недопустимый идентификатор - person user2102665; 18.10.2019
comment
попробуйте XMLAGG( XMLELEMENT (X, FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '‹cm›' || MATCH_DATA || '‹/cm›', CHR(13)||CHR(10)) ORDER BY FIELD_NAME).extract('X/текст()').getclobval() - person Rustam Pulatov; 18.10.2019
comment
опечатка исправлена, еще одна ошибка в строке второго REPLACE( ORA-00938: недостаточно аргументов для функции - person user2102665; 18.10.2019
comment
полный оператор: REPLACE( REPLACE( XMLAGG( XMLELEMENT (X, FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '‹cm›' || MATCH_DATA || '‹/cm›', CHR(13)||CHR (10)) ORDER BY FIELD_NAME).extract('X/text()').getClobVal()),'‹A›',''), '‹/A›','[разделитель])' AS MATCH_ENTRIES - person user2102665; 18.10.2019
comment
Попробуйте: REPLACE( REPLACE( XMLAGG( XMLELEMENT (X, FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '‹cm›' || MATCH_DATA || '‹/cm›', CHR(13)||CHR( 10)) ORDER BY FIELD_NAME).extract('X/text()').getClobVal() ,'‹A›',''), '‹/A›','[разделитель])') - person Rustam Pulatov; 18.10.2019
comment
ORA-00932: несовместимые типы данных: ожидается - получен CLOB, в моем столбце БД нет типа данных CLOB, все эти имена полей в конкатенации находятся в VARCHAR2 - person user2102665; 18.10.2019
comment
Это ошибка замены на clob. покажите это stackoverflow.com/questions/23126455/ - person Rustam Pulatov; 18.10.2019
comment
я попытался сделать substr для clob и преобразовать его в CHAR: TO_CHAR(SUBSTR(REPLACE(REPLACE(XMLAGG(XMLELEMENT(X, FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '‹cm›' || MATCH_DATA || '‹/cm›', CHR(13)||CHR(10)) ORDER BY FIELD_NAME).extract('X/text()').getClobVal(),1,4000)),'‹A›', ''), '‹/A›','[разделитель])') AS MATCH_ENTRIES Другая ошибка: ORA-00938: недостаточно аргументов для функции - person user2102665; 18.10.2019
comment
попробуйте это REPLACE( REPLACE( TO_CHAR(SUBSTR(XMLAGG( XMLELEMENT (X, FIELD_NAME|| INPUT || DESCRIPTION_KEY || ' ' || '‹cm›' || MATCH_DATA || '‹/cm›', CHR(13) ||CHR(10)) ORDER BY FIELD_NAME).extract('X/text()').getClobVal(),1,4000)) ,'‹A›',''), '‹/A›', '[разделитель])') - person Rustam Pulatov; 18.10.2019
comment
Пожалуйста. Подтвердите, пожалуйста, мой ответ правильным. - person Rustam Pulatov; 18.10.2019

Вы пропустили ")" и " '"

Попробуйте это:

REPLACE(
 REPLACE(
    XMLAGG(
       XMLELEMENT("A",NAME|| INPUT || DESC || ' ' || '<cm>' || DATA || '</cm>', CHR(13)||CHR(10) ORDER BY NAME).getClobaVal()),'<A>',''),
   '</A>','[delimiter]') AS ENTRIES
person Ersin Gülbahar    schedule 18.10.2019