Mysql迁移达梦数据库适配GROUP_CONCAT
本文介绍了如何在达梦数据库中实现MySQL的GROUP_CONCAT函数。由于达梦数据库原生不支持该函数但提供类似功能的LISTAGG,当项目需要同时兼容两种数据库时,可以通过创建自定义聚合函数来解决。具体实现步骤包括:1)创建GROUP_CONCAT_TYPE聚合类型;2)实现类型体完成初始化、迭代、终止和合并操作;3)创建GROUP_CONCAT聚合函数;4)建立公共匿名函数以便其他用户使用。
·
我们在迁移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;

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