2012-01-11 14 views
5

मैं Oracle 10g पर हूँ और निम्न तालिका संरचना है: आईडी, आईडी द्वारा अनुच्छेद समूह मेंस्ट्रिंग को कैसे संयोजित करें?

मैं चाहता हूँ और श्रेणीबद्ध पैराग्राफ। प्रत्येक पैराग्राफ शायद 1500 अक्षर या अधिक।

जब मैं wm_concat फ़ंक्शन का प्रयास करता हूं, तो यह शिकायत करता है कि स्ट्रिंग बफर बहुत छोटा है। मैंने वास्तव में ओरेकल की वेबसाइट पर कई उदाहरणों की कोशिश की और वे सभी स्ट्रिंग बफर बहुत कम त्रुटि के साथ असफल हो गए।

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 की गलती है। यह एक कार्य है और मानक एसक्यूएल में पीएल \ एसक्यूएल के पीएल \ एसक्यूएल में ओरेकल की अधिकतम वर्कर लंबाई और 4,000 द्वारा बाधित है। दुर्भाग्यवश, मुझे लगता है कि जिस तरह से wm_concat काम करता है या फ़ंक्शन के भीतर किसी भी कम बाधाओं के कारण या क्योंकि आप इसे चुनने में उपयोग कर रहे हैं, आप ऊपरी सीमा के पास कहीं भी नहीं जा सकते हैं।

एक और विकल्प है, stragg, टॉम क्यटे की स्ट्रिंग कुल कार्य। यदि हम दोनों के बीच निम्न तुलना को देखते हैं तो आप देखेंगे कि वे लगभग समान रूप से प्रदर्शन करते हैं और दोनों की सीमा लगभग 4,000 की लंबाई है, यानी मानक एसक्यूएल अधिकतम। 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. 

इसे हल करने के लिए, मुझे डर है कि आप नहीं कर सकते। एक बार जब आप उस सीमा को मार देते हैं तो यह है। आपको अपने समेकन करने का एक अलग तरीका ढूंढना होगा या खुद से पूछना होगा कि क्या आप वास्तव में की आवश्यकता है।

संबंधित मुद्दे