1. 程式人生 > >WM_CONCAT字元超過4000的處理辦法

WM_CONCAT字元超過4000的處理辦法

轉載自:http://www.cnblogs.com/caroline/archive/2012/11/13/2768902.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中宣告的是varchar2,但是現在deptno是數字,所以資料型別會發生不一致,所以,可以使用to_char見其進行轉換,來避免上述的錯誤:

1 SELECT sys_util.tab2clob(CAST(COLLECT(to_char(deptno)) AS str2tbltype))
2   FROM (SELECT DISTINCT deptno FROM emp)

 二:使用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;

結果:

具體:

   或者使用如下的語句,可以實現同樣的功能:

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;