alternative to listagg in Oracle?

后端 未结 6 1243
孤独总比滥情好
孤独总比滥情好 2020-12-14 20:00

listagg is a function introduced in Oracle 11.2! now this function is bugging us allot, we are migrating from MySQL to Oracle and we have this query:

SELECT
         


        
相关标签:
6条回答
  • 2020-12-14 20:29

    You can solve the ORA-22814 error by using MULTISET instead of COLLECT:

    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;
    
    0 讨论(0)
  • 2020-12-14 20:30

    Use collect or write your own aggregation function.

    0 讨论(0)
  • 2020-12-14 20:37

    WM_CONCAT worked for me.

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

    I wrapped it with a "replace" to specify a different item separator (';') from the one used by WM_CONCAT (',').

    0 讨论(0)
  • 2020-12-14 20:38

    You might want to look at user-defined aggregate functions.

    Differnt string aggregation techniques are shown here. They include an example for user-defined aggregate functions.

    0 讨论(0)
  • 2020-12-14 20:39

    -- Creating Clobe Type -- CREATE OR REPLACE TYPE "MSCONCATIMPL_CLOB" AS OBJECT ( resultstring CLOB, delimiter 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
    

    ); / -- Creating Clobe Type Body --

    CREATE OR REPLACE TYPE BODY "MSCONCATIMPL_CLOB" IS STATIC FUNCTION odciaggregateinitialize ( io_srccontext IN OUT msconcatimpl_clob ) RETURN NUMBER IS BEGIN io_srccontext := msconcatimpl_clob( NULL, NULL ); io_srccontext.delimiter := ' '; RETURN odciconst.success; END odciaggregateinitialize;

    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;
    

    END; /

    -- Creating Clobe Function --

    CREATE OR REPLACE FUNCTION ms_concat_clob ( input VARCHAR2 ) RETURN CLOB PARALLEL_ENABLE AGGREGATE USING msconcatimpl_clob; /

    0 讨论(0)
  • 2020-12-14 20:40

    Use xmlAgg, example is shown below:

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

    This will return clob value and so no need to create custom function.

    0 讨论(0)
提交回复
热议问题