2012-01-11 25 views
5

私は、Oracle 10g上だと、次のテーブル構造を持っている: ID、 段落文字列を連結する方法は?

私はidでグループ化すると段落を連結します。各段落は1500文字以上である可能性があります。

私はwm_concat機能をしようとすると、それは文字列バッファが小さすぎると文句を言い。私は実際にOracleのWebサイトで多くの例を試してみましたが、文字列バッファーが小さすぎるというエラーですべてが失敗します。

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の障害があります。これは、関数と標準SQLでOracleの最大varchar型の32,767のPL \ SQLの長さと4000によって制約されます。残念ながら、私はので、関数内の任意の下制約の作品をwm_concat方法のため、または、想定するか、選択にそれを使用しているので、あなたはどこにも上限近くに取得することはできません。

トム・キテの文字列集約関数straggがあります。次の2つの比較を見ると、それらがほぼ同じように動作し、両方の制限が約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. 

解決策として、私は恐れることができません。その限界に達するとそれだけです。 本当にが必要な場合は、集計を行う別の方法を見つけるか、自分自身に尋ねなければなりません。