參考**:
字串拼接技巧和方式:
在進行使用wm_concat或者自定義的聚合函式,進行拼串的時候,可能遇到拼串形成的結果集大於4000,這時候,系統會提示,超過系統限制。所以,在這個時候,最好的處理辦法就是將結果集處理成clob格式,
下面共有兩種處理方式:
1、使用函式
型別:
1 create or replace type str2tbltype as table of varchar2(4000)
函式:
create or replace function tab2clob(p_str2tbltype str2tbltype,
p_delim in varchar2 default ',') return clob is
l_result clob;
begin
for cc in (select column_value
from table(p_str2tbltype)
order by column_value) loop
l_result := l_result || p_delim || cc.column_value;
end loop;
return ltrim(l_result, p_delim);
end;
測試:初始化資料:
1 begin2 for idx in1..10000loop3 insert into ts1 (tm) values (sys_guid());
4 end loop;
5 end;
測試的sql語句:
1 select tab2clob(cast(collect(tm) as str2tbltype)) attributes2 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...