alternative to listagg in Oracle?

后端 未结 6 1264
孤独总比滥情好
孤独总比滥情好 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: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; /

提交回复
热议问题