WM_CONCAT 문자 4000 이상 처리 방법
15513 단어 Oracle 개발
참조 사이트 주소:
http://stackoverflow.com/questions/11541383/ordering-by-list-of-strings-in-oracle-sql-without-listagg
문자열 맞 춤 법 과 방식:http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php
http://www.williamrobertson.net/documents/one-row.html
WM 사용 중CONCAT 또는 사용자 정의 집합 함 수 를 조합 할 때 조합 이 형 성 된 결과 집합 이 4000 이상 일 수 있 습 니 다.이 럴 때 시스템 은 시스템 제한 을 초과 하여 힌트 를 줄 수 있 습 니 다.그래서 이때 가장 좋 은 처리 방법 은 결과 집 을 CLOB 형식 으로 처리 하 는 것 이다.
다음은 모두 두 가지 처리 방식 이 있다.
1.함수 사용
형식:
1 create or replace type str2tblType as table of varchar2(4000)
함수:
1 CREATE OR REPLACE FUNCTION tab2clob(p_str2tbltype str2tbltype,
2 p_delim IN VARCHAR2 DEFAULT ',') RETURN CLOB IS 3 l_result CLOB;
4 BEGIN 5 FOR cc IN (SELECT column_value
6 FROM TABLE(p_str2tbltype)
7 ORDER BY column_value) LOOP
8 l_result := l_result || p_delim || cc.column_value;
9 END LOOP;
10 RETURN ltrim(l_result, p_delim);
11 END;
테스트:
데이터 초기 화:
1 BEGIN2 FOR idx IN 1 .. 10000 LOOP
3 INSERT INTO ts1 (tm) VALUES (sys_guid());
4 END LOOP;
5 END;
테스트 한 SQL 문장:
1 SELECT tab2clob(CAST(COLLECT(tm) AS str2tbltype)) attributes
2 FROM ts1
3 WHERE rownum < 1000
주의:
다음 SQL 문장 오류:형식 이 다 르 기 때문에
1 SELECT sys_util.tab2clob(CAST(COLLECT(deptno) AS str2tbltype))
2 FROM (SELECT DISTINCT deptno FROM emp)
다음 과 같은 이상 한 정 보 를 던 집 니 다:
str2tbltype 에서 varchar 2 라 고 밝 혔 지만 현재 deptno 는 숫자 이기 때문에 데이터 형식 이 일치 하지 않 을 수 있 으 므 로 to 를 사용 할 수 있 습 니 다.char 는 상기 오 류 를 피하 기 위해 전환 하 는 것 을 보 았 습 니 다.
1 SELECT sys_util.tab2clob(CAST(COLLECT(to_char(deptno)) AS str2tbltype))
2 FROM (SELECT DISTINCT deptno FROM emp)
2.Oracle SQL 에서 제공 하 는 XML 처리 문 구 를 사용 합 니 다:XMLAGG()
SQL 문 구 는 다음 과 같 습 니 다.
1 SELECT rtrim(xmlagg(xmlparse(content ename || ',' wellformed) ORDER BY ename)
2 .getclobval(),
3 ',') attributes,
4 deptno
5 FROM emp
6 GROUP BY deptno;
결과:
구체 적:
또는 다음 과 같은 문 구 를 사용 하면 같은 기능 을 실현 할 수 있 습 니 다.
참고 사이트:http://www.williamrobertson.net/documents/one-row.html
1 SELECT deptno,
2 trim(xmlagg(xmlelement(content, ename || ',' ) ORDER BY ename)
3 .extract('//text()').getclobval())
4 AS concatenated
5 FROM emp
6 GROUP BY deptno;
다음 문 구 는 getClobVal()을 호출 하지 않 았 습 니 다.취 합 된 결과 집합 은 문자열 입 니 다.
1 SELECT deptno,
2 trim(xmlagg(xmlelement(content, ename || ',' ) ORDER BY ename)
3 .extract('//text()'))
4 AS concatenated
5 FROM emp
6 GROUP BY deptno;
Oracle 에서 XML 에 대한 지식 은 다음 을 참고 하 시기 바 랍 니 다.http://www.oratechinfo.co.uk/sqlxml.html
혹은http://www.cnblogs.com/caroline/archive/2012/11/15/2770887.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WM_CONCAT 문자 4000 이상 처리 방법WM 사용 중CONCAT 또는 사용자 정의 집합 함 수 를 조합 할 때 조합 이 형 성 된 결과 집합 이 4000 이상 일 수 있 습 니 다.이 럴 때 시스템 은 시스템 제한 을 초과 하여 힌트 를 줄 수 있 습 니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.