String 尝试在Oracle中编写自定义聚合函数
基本上,我正在写一些我在互联网和StackOverflow上已经找到的东西 我的目标是编写一个自定义聚合函数(在Oracle中),因为COLLECT不充分(我处理的字符串非常大,超过4000个字符),我对WM_CONCAT没有足够的信心,甚至不确定它是否足够 看起来自定义聚合函数是我从嵌套子查询中构建JSON数据字符串、构建对象的最佳解决方案,因此我需要能够指定值之间的分隔符,以便将其放到上下文中 我目前拥有的ORACLE SQL是:String 尝试在Oracle中编写自定义聚合函数,string,oracle,aggregate,collect,String,Oracle,Aggregate,Collect,基本上,我正在写一些我在互联网和StackOverflow上已经找到的东西 我的目标是编写一个自定义聚合函数(在Oracle中),因为COLLECT不充分(我处理的字符串非常大,超过4000个字符),我对WM_CONCAT没有足够的信心,甚至不确定它是否足够 看起来自定义聚合函数是我从嵌套子查询中构建JSON数据字符串、构建对象的最佳解决方案,因此我需要能够指定值之间的分隔符,以便将其放到上下文中 我目前拥有的ORACLE SQL是: CREATE OR REPLACE TYPE parms A
CREATE OR REPLACE TYPE parms AS TABLE OF CLOB;
CREATE OR REPLACE TYPE string_agg_TYPE AS OBJECT
(
total CLOB,
l_delimiter CLOB,
STATIC FUNCTION
ODCIAggregateInitialize(sctx IN OUT string_agg_TYPE )
RETURN NUMBER,
MEMBER FUNCTION
ODCIAggregateIterate(self IN OUT string_agg_TYPE ,
value IN parms )
RETURN NUMBER,
MEMBER FUNCTION
ODCIAggregateTerminate(self IN string_agg_TYPE,
RETURNValue OUT CLOB,
flags IN NUMBER)
RETURN NUMBER,
MEMBER FUNCTION
ODCIAggregateMerge(self IN OUT string_agg_TYPE,
ctx2 IN string_agg_TYPE)
RETURN NUMBER
);
CREATE OR REPLACE TYPE body string_agg_TYPE
IS
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT string_agg_TYPE)
RETURN NUMBER
IS
BEGIN
sctx := string_agg_TYPE( NULL );
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT string_agg_TYPE,
value IN parms )
RETURN NUMBER
IS
BEGIN
IF (value.count = 2)
THEN
self.l_delimiter := value(2);
ELSE
self.l_delimiter := ',';
END IF;
self.total := self.total || self.l_delimiter || value(1);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN string_agg_TYPE,
RETURNValue OUT CLOB,
flags IN NUMBER)
RETURN NUMBER
IS
BEGIN
RETURNValue := ltrim(self.total,self.l_delimiter);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT string_agg_TYPE,
ctx2 IN string_agg_TYPE)
RETURN NUMBER
IS
BEGIN
self.total := self.total || ctx2.total;
RETURN ODCIConst.Success;
END;
END;
当我试图编译主体定义时,Oracle给了我以下错误:
错误(8,11):PLS-00306:调用“STRING\u AGG\u TYPE”时参数的数量或类型错误
有什么明显的遗漏吗
感谢您提供的建议。对象类型
string\u agg\u type
有两个属性:total
和l\u delimiter
,顺便说一句,后者没有理由是CLOB
数据类型,因此,初始化该对象数据类型的实例应在构造函数中为这些属性传入两个初始化值:
sctx := string_agg_TYPE(NULL, NULL);
有趣的是,我刚刚发现了这一点。无论如何,谢谢你。