我有一个选择:
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
但即使在这种情况下,我也有同样的错误。我怎样才能避免这个错误?
答案 0 :(得分:3)
WM_CONCAT返回VARCHAR2,因此在SQL中最多限制为4000个字符。如果需要更多,可以编写自己的字符串聚合函数返回CLOB。但是,考虑一下为什么这样做可能会更好,以及是否没有更好的方法 - 例如使用10G COLLECT功能返回一个集合。
请参阅this article on string aggregation techniques了解如何编写自己的聚合函数。