Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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
Sql 包内的自定义聚合函数_Sql_Oracle_Oracle11g_Aggregate Functions_Ora 00600 - Fatal编程技术网

Sql 包内的自定义聚合函数

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

我试图在Oracle中编写一个自定义聚合函数,并将该函数与我拥有的一些其他函数组合在一个包中。作为一个示例(为了模拟我遇到的问题),假设我的自定义聚合用于对数字进行求和,如下所示:

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年后),没有给出错误,但返回的输出不正确。因此,对于像我这样偶然发现这个问题的人来说:如果用户定义的聚合函数在包中不起作用,请尝试仅使用函数。这是正确的,在包之外定义函数是解决方案,然而,使用包的全部目的是通过在包内对相关函数/过程进行分组来避免名称空间的污染。