1

基本上我正在重写一些我已经在互联网和 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”时参数的数量或类型错误

那么,我错过了什么明显的东西吗?

感谢您的建议,应该提供。

4

1 回答 1

2

对象类型string_agg_TYPE有两个属性:total并且l_delimiter,顺便说一下,后者没有理由成为CLOB数据类型,因此,初始化该对象数据类型的实例,您应该在构造函数中为这些属性传递两个初始化值:

sctx := string_agg_TYPE(NULL, NULL);
于 2013-08-12T12:24:55.613 回答