WM CONCAT字元超過4000的處理辦法

2021-07-26 18:01:23 字數 3896 閱讀 2353

參考**:

字串拼接技巧和方式:

在進行使用wm_concat或者自定義的聚合函式,進行拼串的時候,可能遇到拼串形成的結果集大於4000,這時候,系統會提示,超過系統限制。所以,在這個時候,最好的處理辦法就是將結果集處理成clob格式,

下面共有兩種處理方式:

1、使用函式

型別:

1 create or replace type str2tbltype as table of varchar2(4000)
函式:

1

2

3

4

5

6

7

8

9

10

11

createorreplacefunctiontab2clob(p_str2tbltype str2tbltype,

p_deliminvarchar2default',')returnclobis

l_result clob;

begin

forccin(selectcolumn_value

fromtable(p_str2tbltype)

orderbycolumn_value) loop

l_result := l_result || p_delim || cc.column_value;

endloop;

returnltrim(l_result, p_delim);

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;

關於oracle中xml的知識,請參考:

wmsys.wm_concat使用方法如下:

select cust_no,

sum(ac.money) as money,

sum(ac.invoprint) as invoprint,

min(ac.starttime) as starttime,

max(ac.endtime) as endtime,

wmsys.wm_concat(ac.accountno) accountno

from t_account ac,

t_feetype fee,

--t_submitdetailtoaccount s,

(select accountno, acctypeid

from t_accustaccbookdetail

group by accountno, acctypeid) d

where ac.feecode =fee.feecode

--and ac.accountno =s.accountno

and ac.accountno =d.accountno

and d.acctypeid = '0001'and ac.accstatus = '4'and ac.invoprint = 0and fee.feetype_type =:feetype

--and s.flag = '1'and ac.paydate >= to_date(:startdate, 'yyyy-mm-dd')

and ac.paydate

< to_date(:enddate, 'yyyy-mm-dd') + 1group by cust_no

**:

WM CONCAT字元超過4000的處理辦法

參考 字串拼接技巧和方式 在進行使用wm concat或者自定義的聚合函式,進行拼串的時候,可能遇到拼串形成的結果集大於4000,這時候,系統會提示,超過系統限制。所以,在這個時候,最好的處理辦法就是將結果集處理成clob格式,下面共有兩種處理方式 1 使用函式 型別 1 create or rep...

WM CONCAT字元超過4000的處理辦法

參考 字串拼接技巧和方式 在進行使用wm concat或者自定義的聚合函式,進行拼串的時候,可能遇到拼串形成的結果集大於4000,這時候,系統會提示,超過系統限制。所以,在這個時候,最好的處理辦法就是將結果集處理成clob格式,下面共有兩種處理方式 1 使用函式 型別 1 create orrepl...

wm concat 多行字串拼接

一 wm concat 多行字串拼接 有如下員工部門表emp dept,資料如下 需要實現如下結果 就需要用到wm concat 函式 sql如下 select dept name 部門,wm concat t.emp name 員工 from emp dept t group by dept na...