WM_CONCAT使用CASE

时间:2010-05-06 08:20:32

标签: sql oracle plsql

我有一个选择:

select substr(acc,1,4)
       ,currency
       , amount
       , module
       , count(*)
       , wm_concat(trn_ref_no) trn  
from all_entries 
where date = to_date ('01012010','DDMMYYYY')
group by substr(acc,1,4),currency, amount, module

在这种情况下,我收到一个错误:  ORA-06502: PL/SQL: : character string buffer too small ... "WMSYS.WM_CONCAT_IMPL"

为避免缓冲区限制错误,我将其更改为:

select substr(acc,1,4)
        ,currency
       , amount
       , module
      , count(*)
      , (case when count(*) < 10 then wm_concat(trn_ref_no) else null end) trn  
from fcc.acvw_all_ac_entries 
where trn_dt = to_date ('05052010','DDMMYYYY')
group by substr(acc,1,4),currency, amount, module

但即使在这种情况下,我也有同样的错误。我怎样才能避免这个错误?

1 个答案:

答案 0 :(得分:3)

WM_CONCAT返回VARCHAR2,因此在SQL中最多限制为4000个字符。如果需要更多,可以编写自己的字符串聚合函数返回CLOB。但是,考虑一下为什么这样做可能会更好,以及是否没有更好的方法 - 例如使用10G COLLECT功能返回一个集合。

请参阅this article on string aggregation techniques了解如何编写自己的聚合函数。