2012-01-11 130 views
5

我在Oracle 10g和具有以下表結構: ID, 款如何連接字符串?

我想通過組ID和串聯的段落。每個段落可能有1500個字符或更多。

當我嘗試wm_concat函數時,它抱怨字符串緩衝區太小。我實際上嘗試了許多Oracle網站上的例子,它們都失敗了,因爲字符串緩衝區太小了。

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 – 2012-01-11 20:23:42

回答

3

所以,我猜錯誤是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. 

至於解決它,恐怕你不能。一旦你達到這個限制就是了。你必須找到一個不同的方式來做你的聚合或問自己,如果你真的需要。