WM_CONCAT использовать CASE - PullRequest
2 голосов
/ 06 мая 2010

У меня есть выбор:

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 Ответ

3 голосов
/ 06 мая 2010

WM_CONCAT возвращает VARCHAR2, и поэтому ограничено максимум 4000 символами в SQL. Вы можете написать свою собственную функцию агрегирования строк, которая возвращает CLOB, если вам нужно больше. Однако, может быть, лучше подумать о том, почему вы это делаете, и о том, нет ли лучшего способа вообще - например, используя функцию 10G COLLECT для возврата коллекции.

См. эту статью о методах агрегирования строк , чтобы узнать, как написать собственную функцию агрегирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...