У меня есть запрос ниже -
SELECT /*+ PARALLEL (CNVSO_TBAP_PRICE_PLAN ,16) FULL(CNVSO_TBAP_PRICE_PLAN) */
AP_ID, MAIN_ITEM_ID,
LISTAGG (AP_VERSION_ID || '_' || PARTITION_KEY
|| '_'
|| TO_CHAR (PARTITION_DATE, 'dd/mm/yyyy')) WITHIN GROUP(ORDER BY AP_VERSION_ID) AS LIST,
FROM CNVSO_TBAP_PRICE_PLAN
GROUP BY AP_ID, MAIN_ITEM_ID;
Но получая ошибку -
ORA-01489: результат объединения строк слишком длинный
Если я использую WMCONCAT - запрос выполняется 11 часов (огромная таблица и худшая производительность WMCONCAT).
Я также пробовал XMLAGG, но получаю ошибку недопустимых аргументов:
SELECT /*+ PARALLEL (CNVSO_TBAP_PRICE_PLAN ,16) FULL(CNVSO_TBAP_PRICE_PLAN) */
AP_ID, MAIN_ITEM_ID,
RTRIM (XMLAGG (XMLELEMENT (E, AP_VERSION_ID || '_' || PARTITION_KEY
|| '_'
|| TO_CHAR (PARTITION_DATE, 'dd/mm/yyyy')).EXTRACT ('//text()'), ',')) AS LIST,
MAX (TO_NUMBER (AP_VERSION_ID)) MAX_AP_VERSION_ID
FROM CNVSO_TBAP_PRICE_PLAN
GROUP BY AP_ID, MAIN_ITEM_ID;
Ваша помощь будет принята с благодарностью.. Заранее спасибо.
CNVSO_TBAP_PRICE_PLAN
в цикле построчно и добавляет их в clob. затем функция возвращает clob. тогда вы сможете сделатьSELECT P.*,(SELECT AGG_TO_CLOB(P.AP_ID,P.MAIN_ITEM_ID) FROM DUAL) FROM ( SELECT AP_ID, MAIN_ITEM_ID FROM CNVSO_TBAP_PRICE_PLAN GROUP BY AP_ID, MAIN_ITEM_ID) P;
. Еще лучше было бы использовать табличную функцию:SELECT * FROM TABLE(GET_PRICE_PLAN());
Надеюсь, это поможет . - person Peter   schedule 20.09.2018