我选择了:
select substr(account,1,4), currency, amount, module,count(*) quan, wm_concat(id) ids from all_transactions group by substr(account,1,4), currency, amount, module
但有时COUNT(*)超过600.在这种情况下,我得到: 'ORA-06502:PL / SQL ::字符串缓冲区太小'
有没有办法保留所有记录的wm_concat(id)? 因为对于具有大COUNT(*)的条目排除此函数是出路。
答案 0 :(得分:3)
问题可能是WM_CONCAT()正在尝试生成一个大于VARCHAR2数据库端限制的字符串,我相信它是2000个字符。在PL / SQL代码中,限制很大 - 32767,如果我没记错的话。您可能需要将其分解为多个查询。首先,做你的总结
strAccount VARCHAR2(4);
strCurrency all_transactions.currency%type;
nAmount all_transactions.amount%type;
strModule all_transactions.module%type;
nQuantity NUMBER;
select substr(account,1,4), currency, amount, module, count(*) quan
into strAccount, strCurrency, nAmount, strModule, nQuantity
from all_transactions
group by substr(account,1,4), currency, amount, module
然后移动光标以单独获取名称,并使用您正在使用的任何应用程序语言将它们连接在一起。如果您的代码是用PL / SQL编写的,那么它可能如下所示:
strNames VARCHAR2(32767);
FOR aRow in (select id
from all_transactions
where substr(account, 1, 4) = strAccount and
currency = strCurrency and
amount = nAmount and
module = strModule
order by id)
LOOP
strNames := strNames || aRow.id || ' ';
END LOOP
当然,这不是世界上最优雅的解决方案,但鉴于WM_CONCAT在这里不实用,你可能会遇到这样的问题。
分享并享受。