oracle - Oracle 用户定义聚合函数的问题

标签 oracle plsql aggregate user-defined-functions ora-06553

我遇到了聚合 udfs 的这个烦人的问题,它总是无法调用迭代方法。我的代码就像网络上的其他示例(包括 oracle 文档和 asktom 上的示例)一样。我试图更改 UDF 类型,但每次都会发生同样的情况。它说:

ORA-29925: cannot execute DBAODB.WMCONCATROUTINES.ODCIAGGREGATEITERATE
ORA-06553: PLS-306: wrong number or types of arguments in call to 'ODCIAGGREGATEITERATE'

Oracle 版本是 11.1.0.7.0,这是我的代码:

CREATE OR REPLACE TYPE WmConcatRoutines as object (
    tmpData number,

    STATIC FUNCTION ODCIAggregateInitialize( wmInst IN OUT WmConcatRoutines) RETURN number,
    MEMBER FUNCTION ODCIAggregateIterate(wmInst IN OUT WmConcatRoutines, value number) return number,
    MEMBER FUNCTION ODCIAggregateMerge(wmInst IN OUT WmConcatRoutines, wmInst2 IN WmConcatRoutines) return number,
    MEMBER FUNCTION ODCIAggregateTerminate(wmInst IN WmConcatRoutines, returnValue OUT number, flags IN number) return number
);
/

CREATE OR REPLACE TYPE BODY WmConcatRoutines IS 
    STATIC FUNCTION ODCIAggregateInitialize( wmInst IN OUT WmConcatRoutines) RETURN number IS
    BEGIN
        wmInst := WmConcatRoutines(0);
        return ODCIConst.Success;
    END;

    MEMBER FUNCTION ODCIAggregateIterate(wmInst IN OUT WmConcatRoutines, value number) return number IS
    BEGIN
        wmInst.tmpData := wmInst.tmpData + value;
        return ODCIConst.Success;
    END;

    MEMBER FUNCTION ODCIAggregateTerminate(wmInst IN WmConcatRoutines, returnValue OUT number, flags IN number) return number IS
    BEGIN
        returnValue := wmInst.tmpData;
        return ODCIConst.Success;
    END;

    MEMBER FUNCTION ODCIAggregateMerge(wmInst IN OUT WmConcatRoutines, wmInst2 IN WmConcatRoutines) return number IS
    BEGIN
        wmInst.tmpData := wmInst.tmpData + wmInst2.tmpData;
        return ODCIConst.Success;
    END;
END;
/

CREATE OR REPLACE FUNCTION WM_CONCAT_test (input number) RETURN number 
    parallel_enable 
    AGGREGATE USING WmConcatRoutines;
/

关于可能导致此问题的任何想法?提前致谢

最佳答案

ODCI 函数实现中的参数名称必须与 documentation 中的参数名称相匹配;所以你必须使用 sctxselfctx2 而不是 wminstwminst2.

编辑 正如 APC 简要提到的,似乎只有 self 是必需的;您可以使用其他东西代替 sctxctx2。我找不到文档引用...

编辑 2 是的,我可以... APC 提到它是一个对象,这让我想到了 this .

关于oracle - Oracle 用户定义聚合函数的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9083955/

相关文章:

java - 将字符串数组从java传递给pl/sql函数

plsql - 立即执行创建表和更新表

oracle - 在 PL/SQL 中将逗号分隔的字符串转换为数组

sql - 为什么 Oracle 说不是 GROUP BY 表达式?

python - pandas groupby 聚合元素列表加法

SQL Server 聚合性能

java - DDD 中聚合通信的正确方法

database - 删除跟踪文件的影响?

oracle - 为 CI build设置/拆除 Oracle 模式,无需分割目录

sql - Access 2007、Oracle 和 SQL Server 中的列/表分隔符