Sql WM_CONCAT用例

Sql WM_CONCAT用例,sql,oracle,plsql,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 在

我有一个选择:

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::字符串缓冲区太小。。。“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
选择substr(acc,1,4)
,货币
数量
,模块
,count(*)
,(计数(*)小于10时的情况,然后wm_concat(trn_ref_no)或null end)trn
来自fcc.acvw_的所有条目
其中trn_dt=截止日期('0505020','DDMMYYYY')
按子项(acc,1,4)、货币、金额、模块分组

但即使在这种情况下,我也有同样的错误。如何避免此错误?

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


请参阅如何编写自己的聚合函数。

这与您在“collection is good”中要求的不是很相似,但我在SQL Nagivagor中执行此选择,然后将结果导出到Excel,在这种情况下,集合无法正确导出。我认为您必须接受这样的限制,即此解决方案仅适用于有限数量的串联值。但最有可能的情况可能是10个以上——找到连接时确保适合4000个字符的最大数量。