2012-01-11 2 views
5

나는 오라클 10g에있어하고 다음 테이블 구조를 가지고 : ID, ID로 그룹에문자열 연결 방법은 무엇입니까?

내가 원하는 단락과 단락을 연결. 각 단락은 1500 자 이상일 수 있습니다.

wm_concat 함수를 사용하면 문자열 버퍼가 너무 작다고 불평합니다. 실제로 오라클의 웹 사이트에서 많은 예제를 시도했지만 문자열 버퍼가 너무 작기 때문에 오류가 발생하여 모두 실패합니다.

select id, wm_concat(paragraph) from paragraphs group by id 

어떻게 해결할 수 있습니까?

+0

row_number() 및 sys_connect_by_path를 사용하여이 솔루션을 사용해 보셨습니까? http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php#row_number –

답변

3

그래서 오류가 ORA-06502 인 것으로 추측됩니다.이 상황에서이 문제가 귀하에게 해당되지 않는다고 생각하는 것을 볼 수 있습니다.

그러나 이것은 wm_concat의 결함입니다. 이것은 함수이며 PL \ SQL에서 오라클의 최대 varchar 길이가 32,767이고 표준 SQL에서 4,000으로 제한됩니다. 불행히도, wm_concat이 작동하는 방식이나 함수 내의 더 낮은 제한 때문에 또는 여러분이 선택에서 그것을 사용하고 있기 때문에 여러분은 상한선 근처에서 아무 것도 얻을 수 없다고 생각합니다.

Tom Kyte의 문자열 집계 함수 stragg이 있습니다. 아래 두 가지 비교를 살펴보면 거의 동일하게 수행되며 두 가지 모두 한도는 약 4,000의 길이 (표준 SQL 최대 값)라는 것을 알 수 있습니다. stragg은 캐싱 때문에 약간 빠릅니다.

SQL> set serveroutput on 
SQL> 
SQL> create table tmp_test (a varchar2(30)); 

Table created. 

SQL> insert into tmp_test 
    2 select object_name 
    3  from all_objects 
    4   ; 

81219 rows created. 

SQL> commit ; 

Commit complete. 

SQL> 
SQL> declare 
    2 
    3 i integer := 1; 
    4 k number(10); 
    5 v_stragg varchar2(32767); 
    6 v_test varchar2(32767) := ''; 
    7 start_time timestamp; 
    8 
    9 begin 
10 
11 select count(*) 
12  into k 
13  from tmp_test; 
14 
15 for i in 1 .. k loop 
16  start_time := systimestamp; 
17  begin 
18 
19  select wm_concat(a) into v_test 
20   from tmp_test 
21   where rownum < i; 
22 
23  exception when others then 
24  dbms_output.put_line('wm_concat: ' || length(v_test)); 
25  dbms_output.put_line(systimestamp - start_time); 
26  exit; 
27  end; 
28 end loop; 
29 
30 for i in 1 .. k loop 
31  start_time := systimestamp; 
32 
33  select stragg(a) into v_test 
34  from tmp_test 
35  where rownum < i; 
36 
37  if v_test = 'OVERFLOW' then 
38  dbms_output.put_line('stragg: ' || length(v_stragg)); 
39  dbms_output.put_line(systimestamp - start_time); 
40  exit; 
41  else v_stragg := v_test; 
42  end if; 
43 end loop; 
44 end; 
45/
wm_concat: 3976 
+000000000 00:00:00.005886000 
stragg: 3976 
+000000000 00:00:00.005707000 

PL/SQL procedure successfully completed. 

해결 방법은 다음과 같습니다. 일단 그 한계에 도달하면 바로 그 것입니다. 집계를 수행하는 다른 방법을 찾아야하거나 이 실제로 인 경우 스스로에게 물어보십시오.