wm_concat函数和小字符缓冲区

时间:2010-04-29 11:41:26

标签: sql oracle plsql

我选择了:

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(*)的条目排除此函数是出路。

1 个答案:

答案 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在这里不实用,你可能会遇到这样的问题。

分享并享受。