2010-05-06 75 views
2

我有一個選擇:WM_CONCAT使用CASE

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

是不是這相當類似於你問在http://stackoverflow.com/questions/2558771/charater-string-buffer-too-small – Unreason 2010-05-06 08:52:39

回答

3

WM_CONCAT返回一個VARCHAR2,所以在SQL中被限制爲最多4000個字符。如果你需要更多的話,你可以編寫自己的字符串聚合函數來返回CLOB。但是,最好考慮一下你爲什麼這樣做,以及是否沒有更好的方法 - 例如,使用10G COLLECT函數返回一個集合。

請參閱this article on string aggregation techniques瞭解如何編寫自己的聚合函數。

+0

集合是好的,但我這樣做在SQL Nagivagor中選擇和之後我導出到Excel的結果,在這種情況下,收集不正確導出 – Ruslan 2010-05-06 09:17:32

+0

然後,我認爲你將不得不接受限制,這種解決方案只適用於有限數量的連接值。但它可能會超過10個 - 最大數量確保在連接4000個字符時適合。 – 2010-05-06 11:00:03