programing

listagg 함수를 처음 4000자로 제한

oldcodes 2023. 10. 6. 21:59
반응형

listagg 함수를 처음 4000자로 제한

다음을 사용하는 질문이 있습니다.listagg모든 행을 쉼표로 구분된 문자열로 지정하여 최종적으로 큰 텍스트 상자로 보내도록 하는 함수입니다.다음과 같은 예외가 있습니다.

ORA-01489: result of string concatenation is too long

문제는 데이터를 집계하기 위해 실행 중인 쿼리가 너무 많은 행을 반환하여 문자열이 연결된다는 것입니다.listagg4000자 제한을 위반하고 있습니다.하지만 제 사용 사례의 경우 처음 4,000자로 잘라내는 것은 완벽하게 허용됩니다.

여기서 나오는 이 예제 쿼리를 어떻게 수정하여 "value" 열을 최대 4000자로 제한합니까?

SELECT LISTAGG(product_name, ', ') WITHIN GROUP( ORDER BY product_name DESC) "Product_Listing" FROM products

포장은 안됩니다.substr전화가 오면listagg' becauselistaggthrows the exception beforesubstrate'라고 불리는 경우가 있습니다.

저는 SO에 대해 4000자 제한을 극복하는 방법에 대해 많은 질문을 보았지만 결과 값을 제한하지는 않았습니다.

12.2 이상

ON OVERFLOWoption makes는 4000바이트 이상을 쉽게 처리할 수 있습니다.

select listagg(product_name, ',' on overflow truncate) within group (order by product_name)
from products;

11.2 ~ 12.1

분석 함수는 문자열 집합의 실행 총 길이를 생성할 수 있습니다.그러면 인라인 뷰는 길이가 4000보다 큰 값을 모두 제거할 수 있습니다.

실제 쿼리에서 다음을 추가해야 할 수도 있습니다.partition by분석 함수에, 그룹별로만 계산할 수 있습니다.

--The first 4000 bytes of PRODUCT_NAME.
select
    --Save a little space for a ' ...' to imply that there is more data not shown.
    case when max(total_length) > 3996 then
        listagg(product_name, ', ') within group (order by product_name)||
            ' ...'
    else
        listagg(product_name, ', ') within group (order by product_name)
    end product_names
from
(
    --Get names and count lengths.
    select
        product_name,
        --Add 2 for delimiters. Use LENGTHB in case of multibyte characters.
        sum(lengthb(product_name) + 2) over (order by product_name) running_length,
        sum(lengthb(product_name) + 2) over () total_length
    from products
    order by product_name
)
where running_length <= 3996;

쿼리를 보여주는 db<> fiddle입니다.

언급URL : https://stackoverflow.com/questions/28301443/limit-listagg-function-to-first-4000-characters

반응형