我们在迁移Mysql数据库后,有些内置的mysql函数如GROUP_CONCAT达梦数据库是没有的,虽然他有类似的函数如LISTAGG,但是这就需要改动代码了,如果你的项目只需要支持达梦数据库,那问题不大,改改代码就行了,如果你的项目需要同时支持Mysql和达梦,那就需要达梦数据库支持GROUP_CONCAT函数了,下面是该函数实现

-- 1. 创建聚合函数类型
CREATE OR REPLACE TYPE GROUP_CONCAT_TYPE AS OBJECT (
    result VARCHAR(32767),
    
    STATIC FUNCTION ODCIAggregateInitialize(
        ctx IN OUT GROUP_CONCAT_TYPE
    ) RETURN NUMBER,
    
    MEMBER FUNCTION ODCIAggregateIterate(
        self IN OUT GROUP_CONCAT_TYPE,
        value IN VARCHAR
    ) RETURN NUMBER,
    
    MEMBER FUNCTION ODCIAggregateTerminate(
        self IN GROUP_CONCAT_TYPE,
        returnValue OUT VARCHAR,
        flags IN NUMBER
    ) RETURN NUMBER,
    
    MEMBER FUNCTION ODCIAggregateMerge(
        self IN OUT GROUP_CONCAT_TYPE,
        ctx2 IN GROUP_CONCAT_TYPE
    ) RETURN NUMBER
);
/

-- 2. 实现类型体
CREATE OR REPLACE TYPE BODY GROUP_CONCAT_TYPE IS
    STATIC FUNCTION ODCIAggregateInitialize(
        ctx IN OUT GROUP_CONCAT_TYPE
    ) RETURN NUMBER IS
    BEGIN
        ctx := GROUP_CONCAT_TYPE(NULL);
        RETURN ODCIConst.Success;
    END;
    
    MEMBER FUNCTION ODCIAggregateIterate(
        self IN OUT GROUP_CONCAT_TYPE,
        value IN VARCHAR
    ) RETURN NUMBER IS
    BEGIN
        IF self.result IS NULL THEN
            self.result := value;
        ELSE
            self.result := self.result || ',' || value;
        END IF;
        RETURN ODCIConst.Success;
    END;
    
    MEMBER FUNCTION ODCIAggregateTerminate(
        self IN GROUP_CONCAT_TYPE,
        returnValue OUT VARCHAR,
        flags IN NUMBER
    ) RETURN NUMBER IS
    BEGIN
        returnValue := self.result;
        RETURN ODCIConst.Success;
    END;
    
    MEMBER FUNCTION ODCIAggregateMerge(
        self IN OUT GROUP_CONCAT_TYPE,
        ctx2 IN GROUP_CONCAT_TYPE
    ) RETURN NUMBER IS
    BEGIN
        IF ctx2.result IS NOT NULL THEN
            IF self.result IS NULL THEN
                self.result := ctx2.result;
            ELSE
                self.result := self.result || ',' || ctx2.result;
            END IF;
        END IF;
        RETURN ODCIConst.Success;
    END;
END;
/

-- 3. 创建聚合函数
CREATE OR REPLACE FUNCTION GROUP_CONCAT(input VARCHAR) RETURN VARCHAR
PARALLEL_ENABLE AGGREGATE USING GROUP_CONCAT_TYPE;
/

最后想要其他用户也能使用这个函数,需要建个公共匿名函数

CREATE PUBLIC SYNONYM GROUP_CONCAT FOR SYSDBA.GROUP_CONCAT;

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐