WM_CONCAT 문자 4000 이상 처리 방법

15513 단어 Oracle 개발
다음으로 전송:http://www.cnblogs.com/caroline/archive/2012/11/13/2768902.html
참조 사이트 주소:
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

좋은 웹페이지 즐겨찾기