그래서 오류가 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.
해결 방법은 다음과 같습니다. 일단 그 한계에 도달하면 바로 그 것입니다. 집계를 수행하는 다른 방법을 찾아야하거나 이 실제로 인 경우 스스로에게 물어보십시오.
출처
2012-01-11 18:56:49
Ben
row_number() 및 sys_connect_by_path를 사용하여이 솔루션을 사용해 보셨습니까? http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php#row_number –