Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 尝试在Oracle中编写自定义聚合函数_String_Oracle_Aggregate_Collect - Fatal编程技术网

String 尝试在Oracle中编写自定义聚合函数

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

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

有什么明显的遗漏吗


感谢您提供的建议。

对象类型
string\u agg\u type
有两个属性:
total
l\u delimiter
,顺便说一句,后者没有理由是
CLOB
数据类型,因此,初始化该对象数据类型的实例应在构造函数中为这些属性传入两个初始化值:

sctx := string_agg_TYPE(NULL, NULL);

有趣的是,我刚刚发现了这一点。无论如何,谢谢你。