Vì vậy, tôi đoán lỗi là ORA-06502
và tôi có thể thấy cách bạn có thể nghĩ rằng điều này không áp dụng cho bạn trong tình huống này.
Tuy nhiên, đây là lỗi của wm_concat
. Đây là một hàm và bị giới hạn bởi độ dài varchar tối đa của Oracle trong PL \ SQL là 32,767 và 4.000 trong SQL chuẩn. Thật không may, tôi cho rằng do cách thức hoạt động của wm_concat hoặc do bất kỳ ràng buộc nào thấp hơn trong hàm hoặc vì bạn đang sử dụng nó trong một lựa chọn, bạn không thể đến gần giới hạn trên.
Có một tùy chọn khác, stragg
, Hàm tổng hợp chuỗi của Tom Kyte. Nếu chúng ta nhìn vào so sánh sau đây giữa cả hai, bạn sẽ thấy rằng chúng hoạt động gần như giống nhau và giới hạn của cả hai là độ dài khoảng 4.000, tức là tối đa SQL tiêu chuẩn. stragg
nhanh hơn một chút, có thể là do bộ nhớ đệm.
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.
Về phần giải quyết, e rằng không thể. Một khi bạn đạt đến giới hạn đó, đó là nó. Bạn sẽ phải tìm một cách khác để thực hiện việc tổng hợp của mình hoặc tự hỏi bản thân xem bạn có thực sự cần phải.