注册

自定义集函数GROUP_CONCAT,报错存在集函数

开心就好 2025/01/24 550 3 已解决

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM Database Server 64 V8
【操作系统】:Linux
【CPU】:4核2.5Hz
【问题描述】*:
写了一个自定义类型

CREATE OR REPLACE TYPE "wzjf_zlzf_uat".GroupConcatType AS OBJECT (
	expr VARCHAR2(4000),
	delim VARCHAR2(10),
	--初始化
	STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT GroupConcatType)
		RETURN NUMBER,
	--迭代计算
	MEMBER FUNCTION ODCIAggregateIterate(self IN OUT GroupConcatType,
		value IN VARCHAR) RETURN NUMBER,
	--合并
	MEMBER FUNCTION ODCIAggregateMerge(self IN OUT GroupConcatType, 
		ctx2 IN GroupConcatType) RETURN NUMBER,
	--终止
	MEMBER FUNCTION ODCIAggregateTerminate(self IN GroupConcatType, 
		returnValue OUT VARCHAR, flags IN NUMBER) RETURN NUMBER
);

类型体

CREATE OR REPLACE TYPE BODY "wzjf_zlzf_uat".GroupConcatType IS
	--初始化
	STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT GroupConcatType) 
		RETURN NUMBER IS
    BEGIN
    	print 'ODCIAggregateInitialize';
        sctx := GroupConcatType('', ',');
        RETURN ODCIConst.SUCCESS;
    END;
    --迭代
    MEMBER FUNCTION ODCIAggregateIterate(self IN OUT GroupConcatType, value IN VARCHAR2) RETURN NUMBER IS
    BEGIN
    	print 'ODCIAggregateIterate';
    	print self.expr;
    	print 'value';
    	print value;
        IF self.expr IS NULL OR self.expr = '' THEN
            self.expr := value;
        ELSE
            self.expr := self.expr || self.delim || value;
        END IF;
        RETURN ODCIConst.SUCCESS;
    END;
 	--合并
    MEMBER FUNCTION ODCIAggregateMerge(self IN OUT GroupConcatType, ctx2 IN GroupConcatType) RETURN NUMBER IS
    BEGIN
    	print 'ODCIAggregateMerge';
    	print self.expr;
    	print 'ctx2';
    	print ctx2.expr;
        IF self.expr IS NULL OR self.expr = '' THEN
            self.expr := ctx2.expr;
        ELSIF ctx2.expr IS NOT NULL AND ctx2.expr != '' THEN
            self.expr := self.expr || self.delim || ctx2.expr;
        END IF;
        RETURN ODCIConst.SUCCESS;
    END;
 	--终止
    MEMBER FUNCTION ODCIAggregateTerminate(self IN GroupConcatType, 
    	returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER IS
    BEGIN
       	print 'ODCIAggregateTerminate';
        returnValue := self.expr;
        RETURN ODCIConst.SUCCESS;
    END;
END;

又写了一个函数

CREATE OR REPLACE FUNCTION "wzjf_zlzf_uat"."GROUP_CONCAT" (
	expr IN VARCHAR2,
	delim IN VARCHAR2 DEFAULT ','
)
RETURN VARCHAR2
AGGREGATE USING "wzjf_zlzf_uat".GroupConcatType;

这么调用报:存在集函数

SELECT group_key, GROUP_CONCAT(code_name, ',')
FROM "xxx"
where group_key = 'repair_status'
GROUP BY group_key;

image.png

这么调用报:非法的参数数据

SELECT group_key, GROUP_CONCAT(code_name)
FROM "xxx"
where group_key = 'repair_status'
GROUP BY group_key;

image.png

回答 0
暂无回答
扫一扫
联系客服