Sql 包内的自定义聚合函数
我试图在Oracle中编写一个自定义聚合函数,并将该函数与我拥有的一些其他函数组合在一个包中。作为一个示例(为了模拟我遇到的问题),假设我的自定义聚合用于对数字进行求和,如下所示:Sql 包内的自定义聚合函数,sql,oracle,oracle11g,aggregate-functions,ora-00600,Sql,Oracle,Oracle11g,Aggregate Functions,Ora 00600,我试图在Oracle中编写一个自定义聚合函数,并将该函数与我拥有的一些其他函数组合在一个包中。作为一个示例(为了模拟我遇到的问题),假设我的自定义聚合用于对数字进行求和,如下所示: CREATE OR REPLACE TYPE SUM_AGGREGATOR_TYPE AS OBJECT ( summation NUMBER, STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT SUM_AGGREGA
CREATE OR REPLACE TYPE SUM_AGGREGATOR_TYPE AS OBJECT (
summation NUMBER,
STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT
SUM_AGGREGATOR_TYPE) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SUM_AGGREGATOR_TYPE,
next_number IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SUM_AGGREGATOR_TYPE,
para_context IN SUM_AGGREGATOR_TYPE) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN SUM_AGGREGATOR_TYPE,
return_value OUT NUMBER, flags IN NUMBER) RETURN NUMBER
);
如果我编写以下函数定义:
CREATE OR REPLACE FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
CREATE OR REPLACE PACKAGE MY_FUNCTIONS AS
FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
END;
以及要测试的相应类型声明:
CREATE OR REPLACE TYPE VECTOR
IS
TABLE OF NUMBER;
本声明:
select my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
给出70的正确结果。但是,使用函数定义创建包:
CREATE OR REPLACE FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
CREATE OR REPLACE PACKAGE MY_FUNCTIONS AS
FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
END;
并通过以下方式调用:
select MY_FUNCTIONS.my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
爆发
ORA-00600: internal error code, arguments: [17090], [], [], [], [], [], [], [], [], [], [], []
是否可以在包声明中嵌套自定义聚合函数?Oracle使用ORA-00600来表示未处理的异常,即bug。第一个参数表示异常;ORA-17090是一种通用的“不允许操作”。通常,它们仅限于数据库版本和操作系统平台的特定排列。其他时候,这只是意味着我们正在做一些非常不寻常的事情 在包中包含自定义聚合函数是否算作“非常不寻常”?不确定。当然,我们被允许在PL/SQL函数中包含数据盒带函数。但用户定义的聚合是ODCI的一个特例。虽然文档中没有针对包的明确规则,但所有示例都使用
CREATE函数
实现聚合
那么,该怎么办?好的,ORA-00600消息需要Oracle支持的介入,因为它需要一个补丁。如果你有一个支持帐户,你可以。您需要提交iTAR以获得进一步的解决方案。否则我恐怕你可能走运了 “ORA-00600”通常表示Oracle错误-有时是由于意外的功能组合。您运行的是什么Oracle版本?我使用的是Oracle 11g第2版(11.2.0.1.0)。关于这个问题,您有什么新消息吗?我也有问题,但是,在我的情况下,连接被中止
ORA-03113:end-of-file on-communication channel
。我想这比ORA-00600更糟糕。当我在所有过程中选中SELECT*
时,我可以看到用户定义的聚合已正确创建和注册…不,还没有收到任何回复。我在网站上发布了这个错误,请随时关注我的帖子。奇怪的是,这是不受支持的。我将在Oracle论坛上发布这篇文章,看看他们有什么要说的。创建Oracle论坛帖子:这样Oracle的人就可以跟进这篇文章。根据我提出的一个问题,似乎用户定义的聚合函数在您仅创建函数时可以工作,但在包中不工作。在我的例子中(大约3年后),没有给出错误,但返回的输出不正确。因此,对于像我这样偶然发现这个问题的人来说:如果用户定义的聚合函数在包中不起作用,请尝试仅使用函数。这是正确的,在包之外定义函数是解决方案,然而,使用包的全部目的是通过在包内对相关函数/过程进行分组来避免名称空间的污染。