基本上我正在重写一些我已经在互联网和 StackOverflow 上找到的东西。
我的目标是编写一个自定义聚合函数(在 Oracle 中),因为 COLLECT 不够用(我正在处理 4000 个字符以上的非常大的字符串),我对 WM_CONCAT 没有足够的信心,甚至不确定它是否足够.
看起来自定义聚合函数是我从嵌套子查询构建 JSON 数据字符串、构建对象的最佳解决方案,因此我需要能够指定值之间的分隔符 - 将其放入上下文中。
我拥有的当前 ORACLE SQL 是这样的:
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_AGG_TYPE”时参数的数量或类型错误
那么,我错过了什么明显的东西吗?
感谢您的建议,应该提供。