我在Oracle 10g和具有以下表結構: ID, 款如何連接字符串?
我想通過組ID和串聯的段落。每個段落可能有1500個字符或更多。
當我嘗試wm_concat函數時,它抱怨字符串緩衝區太小。我實際上嘗試了許多Oracle網站上的例子,它們都失敗了,因爲字符串緩衝區太小了。
select id, wm_concat(paragraph) from paragraphs group by id
我該如何解決這個問題?
我在Oracle 10g和具有以下表結構: ID, 款如何連接字符串?
我想通過組ID和串聯的段落。每個段落可能有1500個字符或更多。
當我嘗試wm_concat函數時,它抱怨字符串緩衝區太小。我實際上嘗試了許多Oracle網站上的例子,它們都失敗了,因爲字符串緩衝區太小了。
select id, wm_concat(paragraph) from paragraphs group by id
我該如何解決這個問題?
所以,我猜錯誤是ORA-06502
,我可以看到你怎麼會認爲這不適用於你在這種情況下。
但是,這是wm_concat
的錯。這是一個函數,並且受Oracle的PL/SQL中的最大varchar長度32,767和4,000在標準SQL中的限制。不幸的是,我認爲,由於wm_concat的工作方式或者由於函數內部的約束較少,或者因爲您在select中使用它,所以無法接近上限。
還有另一種選擇,stragg
,Tom Kyte的字符串聚合函數。如果我們看一下兩者之間的比較,你會發現它們的表現幾乎完全相同,並且兩者的限制都是大約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.
至於解決它,恐怕你不能。一旦你達到這個限制就是了。你必須找到一個不同的方式來做你的聚合或問自己,如果你真的需要。
你試過這個解決方案嗎(使用row_number()和sys_connect_by_path):http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php#row_number – 2012-01-11 20:23:42