Нужна помощь с опциями LISTAGG - PullRequest
0 голосов
/ 15 января 2019

LISTAGG имеет ограничение в 4000 символов. Кто-нибудь может помочь с этим кошмарным запросом?

Привет, у меня плохой код в запросе, который передает приложение. В этой форме запрос не имеет реальных критериев. И из-за этого LISTAGG достигает предела 4000 символов.

Есть ли здесь другой вариант? Исходя из того, как все соединено, я не вижу простого ответа:

SELECT 
    email,
    first_name,
    last_name, 
    LISTAGG(
        type_id 
        ||','|| type_status 
        ||','|| filename 
        ||','|| status_id
        ||','|| status_message 
        ||','|| TO_CHAR(upload_date,'MM/DDYYYY') 
        ||','|| broker 
        ||','|| quarter 
        ||','|| quarter_year
        ||':'
    ) WITHIN GROUP (ORDER BY upload_date DESC) filenames
FROM 
    (
        SELECT 
            b.surrogate_key, 
            b.email,
            b.type_id, 
            DECODE(a.file_type,NULL,0,1) type_status, 
            a.quarter, 
            a.quarter_year, 
            a.broker, 
            a.upload_date, 
            a.filename, 
            a.status_id, 
            b.first_name, 
            b.last_name, 
            a.status_message
        FROM 
            (
                SELECT DISTINCT
                    (editor || '~' || file_type) surrogate_key,
                    file_type, 
                    quarter, 
                    quarter_year, 
                    broker,
                    filename,
                    upload_date,
                    status_id, 
                    status_message
                FROM upload_history
                ORDER BY upload_date DESC
            ) a, 
            (
                SELECT DISTINCT
                    (email||'~'||type_id) surrogate_key, 
                    email, 
                    type_id, 
                    first_name, 
                    last_name
                FROM issuers
                CROSS JOIN file_types 
            ) b
        WHERE 
            b.surrogate_key = a.surrogate_key(+)
    ) 
GROUP BY 
    email,
    first_name, 
    last_name, 
    type_id, 
    quarter, 
    quarter_year;

1 Ответ

0 голосов
/ 15 января 2019

Классический обходной путь ограничения в 4000 символов LISTAGG заключается в использовании XMLAGG, как объяснено в в этом знаменитом сообщении AskTom .

Синтаксис немного запутанный. В вашем случае вы должны заменить это:

    LISTAGG(
        type_id 
        ||','|| type_status 
        ||','|| filename 
        ||','|| status_id
        ||','|| status_message 
        ||','|| TO_CHAR(upload_date,'MM/DDYYYY') 
        ||','|| broker 
        ||','|| quarter 
        ||','|| quarter_year
        ||':'
    ) WITHIN GROUP (ORDER BY upload_date DESC) filenames

С:

    REPLACE(REPLACE(
        XMLAGG(XMLELEMENT("a", 
            type_id 
            ||','|| type_status 
            ||','|| filename 
            ||','|| status_id
            ||','|| status_message 
            ||','|| TO_CHAR(upload_date,'MM/DDYYYY') 
            ||','|| broker 
            ||','|| quarter 
            ||','|| quarter_year
            ||':'
        ) ORDER BY upload_date DESC).getClobVal(),
    '<a>', ''), '</a>', ',') filenames
...