2012-02-23 14 views
13

listagg ओरेकल 11.2 में पेश किया गया एक फ़ंक्शन है! अब इस समारोह हमें आवंटित, हम Oracle करने के लिए MySQL से माइग्रेट कर रहे हैं गुस्सा दिलाना है और हम इस प्रश्न हैं:ओरेकल में listagg के विकल्प?

SELECT 
    p_id, 
    MAX(registered) AS registered, 
    listagg(MESSAGE, ' ') within GROUP (ORDER BY registered) AS MESSAGE 
    FROM 
    umm_parent_id_remarks_v m 
    GROUP BY 
    m.p_id; 

है जहाँ तक MySQL में ठीक काम करता है के रूप में हम जानते हैं क्या हमें गुस्सा दिलाना ओरेकल किया जा रहा है यह VARCAR और नहीं देता है सीएलओबी की जरूरत है! टेक्स्ट बहुत बड़ा है और हमें इसकी आवश्यकता है CLOB!

यहां मैंने जो करने की कोशिश की है!

सीएलओबी प्रकार की एक सीएलओबी_T तालिका बनाएं!

तो अब समारोह

create or replace 
function listaggclob (t in clob_t) 
    return clob 
as 
    ret clob := ''; 
    i number; 
begin 
    i := t.first; 
    while i is not null loop 
    if ret is not null then 
     ret := ret || ' '; 
    end if; 
    ret := ret || t(i); 
    i := t.next(i); 
    end loop; 
    return ret; 
end; 

बनाने अगर मैं इसे चलाएँ:

SELECT 
     p_id, 
     MAX(registered) AS registered, 
     listaggclob(cast(collect (MESSAGE) as clob_t)) MESSAGE 
     FROM 
     umm_parent_id_remarks_v m 
     GROUP BY 
     m.p_id; 

मैं

ORA-22,814: विशेषता या तत्व मान प्रकार में निर्दिष्ट से बड़ा है

क्या इसके लिए कोई समाधान है?

आप धन्यवाद

उत्तर

14

उपयोग collect या write your own aggregation function

+1

+1 संग्रह लिंक के लिए धन्यवाद! – tbone

+0

मैंने अपना खुद का काम लिखा और मैंने अपना प्रश्न अपडेट किया, कृपया मेरे प्रश्न की फिर से समीक्षा करें, धन्यवाद –

+0

मुझे नहीं पता कि आपको यह त्रुटि क्यों मिल रही है - शायद यह एक नए प्रश्न के रूप में पोस्ट करने लायक है, आपको अधिक लोग मिलेंगे इस तरह से देख रहे हैं। –

2

आप user-defined aggregate functions पर देख सकते हैं।

डिफर्नट स्ट्रिंग एकत्रीकरण तकनीक here दिखायी जाती है। उनमें उपयोगकर्ता परिभाषित कुल कार्यों के लिए एक उदाहरण शामिल है।

+0

वहां विकल्पों का अच्छा सेट। क्या कोई जानकारी है जो तेज हैं? –

+0

मुझे प्रदर्शन के बारे में कोई जानकारी नहीं है। मुझे लगता है कि यह मुख्य रूप से समग्र निष्पादन योजना पर निर्भर करता है और वे उस निष्पादन योजना में कैसे फिट होते हैं। तो यह क्वेरी से क्वेरी में भिन्न हो सकता है। – Codo

2

आप MULTISET बजाय COLLECT का उपयोग करके ORA-22814 त्रुटि को हल कर सकते हैं:

SELECT 
    p_id, 
    MAX(registered) AS registered, 
    listaggclob(cast(multiset(
     select MESSAGE 
     from umm_parent_id_remarks_v 
     where umm_parent_id_remarks_v.p_id = m.p_id 
    ) as clob_t)) MESSAGE 
    FROM 
    umm_parent_id_remarks_v m 
    GROUP BY 
    m.p_id; 
2

WM_CONCAT मेरे लिए काम किया। (',') WM_CONCAT द्वारा प्रयोग किया जाता से, ('')

SELECT replace(WMSYS.WM_CONCAT(myTable.name), ',', ';') 
FROM myTable 
GROUP BY myTable.id 

मैं एक अलग मद विभाजक निर्दिष्ट करने के लिए के साथ एक "की जगह" लपेटा।

+2

ध्यान दें कि WM_CONCAT 12c, एक्सप्रेस संस्करण, और किसी भी डेटाबेस में उपलब्ध नहीं है जहां वर्कस्पेस प्रबंधक स्थापित नहीं है। –

+1

यह आजकल समर्थित नहीं है और न ही दस्तावेज है –

1

उपयोग xmlAgg, उदाहरण के नीचे दिखाया गया है:

SELECT RTRIM(XMLAGG(XMLELEMENT(E,colname,',').EXTRACT('//text()') ORDER BY colname).GetClobVal(),',') AS LIST 
FROM tablename; 

यह CLOB मूल्य और इतने कस्टम समारोह बनाने की आवश्यकता वापस आ जाएगी।

0

- Clobe प्रकार का निर्माण - बना सकते हैं या REPLACE प्रकार "MSCONCATIMPL_CLOB" वस्तु के रूप में ( CLOB, resultstring VARCHAR2 (10) सीमांकक,

STATIC FUNCTION odciaggregateinitialize (io_srccontext IN OUT msconcatimpl_clob) RETURN NUMBER, 

MEMBER FUNCTION odciaggregateiterate (
    self IN OUT msconcatimpl_clob, 
    value IN CLOB 
) RETURN NUMBER, 

MEMBER FUNCTION odciaggregateterminate (
    self   IN msconcatimpl_clob, 
    o_returnvalue OUT CLOB, 
    i_flags   IN NUMBER 
) RETURN NUMBER, 

MEMBER FUNCTION odciaggregatemerge (
    self IN OUT msconcatimpl_clob, 
    i_ctx2 IN msconcatimpl_clob 
) RETURN NUMBER 

); / - बनाना Clobe प्रकार शरीर -

बना सकते हैं या REPLACE प्रकार शरीर "MSCONCATIMPL_CLOB" (io_srccontext में बाहर msconcatimpl_clob) रिटर्न संख्या शुरू है स्थिर समारोह odciaggregateinitialize io_srccontext: = msconcatimpl_clob ( शून्य, नल ); io_srccontext.delimiter: = ''; वापसी odciconst.success; ईएनडी odciaggregate आरंभ करें;

MEMBER FUNCTION odciaggregateiterate (
    self IN OUT msconcatimpl_clob, 
    value IN CLOB 
) RETURN NUMBER 
    IS 
BEGIN 
    IF 
     value IS NOT NULL 
    THEN 
     IF 
      self.resultstring IS NULL 
     THEN 
      self.resultstring := self.resultstring || value; 
     ELSE 
      self.resultstring := self.resultstring 
      || self.delimiter 
      || value; 
     END IF; 
    END IF; 

    RETURN odciconst.success; 
END odciaggregateiterate; 

MEMBER FUNCTION odciaggregateterminate (
    self   IN msconcatimpl_clob, 
    o_returnvalue OUT CLOB, 
    i_flags   IN NUMBER 
) RETURN NUMBER 
    IS 
BEGIN 
    o_returnvalue := self.resultstring; 
    RETURN odciconst.success; 
END odciaggregateterminate; 

MEMBER FUNCTION odciaggregatemerge (
    self IN OUT msconcatimpl_clob, 
    i_ctx2 IN msconcatimpl_clob 
) RETURN NUMBER 
    IS 
BEGIN 
    IF 
      self.resultstring IS NULL 
     AND 
      i_ctx2.resultstring IS NOT NULL 
    THEN 
     self.resultstring := i_ctx2.resultstring; 
    ELSIF 
     self.resultstring IS NOT NULL 
    AND 
     i_ctx2.resultstring IS NOT NULL 
    THEN 
     self.resultstring := self.resultstring 
     || self.delimiter 
     || i_ctx2.resultstring; 
    END IF; 

    RETURN odciconst.success; 
END odciaggregatemerge; 

ईएनडी; /

- बनाना Clobe फंक्शन -

बनाएं या समारोह ms_concat_clob (इनपुट VARCHAR2) रिटर्न CLOB REPLACE PARALLEL_ENABLE समग्र msconcatimpl_clob का उपयोग करना; /

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

  • कोई संबंधित समस्या नहीं^_^