2010-05-06 3 views
2

나는 선택이 있습니다WM_CONCAT 사용 CASE

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 

그러나 : 나는 그것을 변경 ORA-06502: PL/SQL: : character string buffer too small ... "WMSYS.WM_CONCAT_IMPL"

버퍼 제한 오류를 방지하려면 :이 경우

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 

내가 오류가 발생 이 경우에도 동일한 오류가 있습니다. 어떻게이 오류를 피할 수 있습니까?

+0

당신이 요청한 것과 다소 비슷합니다 http://stackoverflow.com/questions/2558771/charater-string-buffer-too-small – Unreason

답변

3

WM_CONCAT은 VARCHAR2를 반환하므로 SQL에서 최대 4000 자로 제한됩니다. CLOB를 리턴 한 자신 만의 문자열 집계 함수를 작성할 수있다. 그러나 왜 이런 일을하는지, 그리고 더 좋은 방법이 없는지 생각해 보는 것이 좋습니다. 10G COLLECT 함수를 사용하여 콜렉션을 리턴하십시오.

자신의 집계 함수를 작성하는 방법은 this article on string aggregation techniques을 참조하십시오.

+0

컬렉션이 좋았지 만 SQL Nagivagor에서이 작업을 수행했습니다. 결과를 Excel로 내보내고이 경우 컬렉션이 제대로 내보내지지 않습니다. – Ruslan

+0

그러면이 솔루션은 제한된 수의 연결된 값에 대해서만 유용하다는 한계를 받아 들여야 할 것입니다. 하지만 10 개 이상의 가능성이 있습니다 - 연결될 때 4000 자 이내로 맞출 수있는 최대 수를 찾으십시오. –