listagg 함수를 처음 4000자로 제한
다음을 사용하는 질문이 있습니다.listagg
모든 행을 쉼표로 구분된 문자열로 지정하여 최종적으로 큰 텍스트 상자로 보내도록 하는 함수입니다.다음과 같은 예외가 있습니다.
ORA-01489: result of string concatenation is too long
문제는 데이터를 집계하기 위해 실행 중인 쿼리가 너무 많은 행을 반환하여 문자열이 연결된다는 것입니다.listagg
4000자 제한을 위반하고 있습니다.하지만 제 사용 사례의 경우 처음 4,000자로 잘라내는 것은 완벽하게 허용됩니다.
여기서 나오는 이 예제 쿼리를 어떻게 수정하여 "value" 열을 최대 4000자로 제한합니까?
SELECT LISTAGG(product_name, ', ') WITHIN GROUP( ORDER BY product_name DESC) "Product_Listing" FROM products
포장은 안됩니다.substr
전화가 오면listagg' because
listaggthrows the exception before
substrate'라고 불리는 경우가 있습니다.
저는 SO에 대해 4000자 제한을 극복하는 방법에 대해 많은 질문을 보았지만 결과 값을 제한하지는 않았습니다.
12.2 이상
그ON OVERFLOW
option 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
'programing' 카테고리의 다른 글
프로그래밍 방식으로 Excel 2007 시트 만들기 (0) | 2023.10.06 |
---|---|
Ricoh Theta S - 자바스크립트로 라이브 프리뷰 (0) | 2023.10.06 |
AngularJsui-router: 강제 재로드 (0) | 2023.10.06 |
MariaDB에서 루트 암호를 암호화하는 방법은? (0) | 2023.10.06 |
jQuery에서 사용자가 해당 필드를 편집하는 동안 텍스트 필드의 첫 글자를 대문자로 쓰는 방법은 무엇입니까? (0) | 2023.10.06 |