Mysql迁移达梦数据库适配GROUP_CONCAT
·
我们在迁移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;
更多推荐
所有评论(0)