wcm*_*sen 3 sql oracle aggregate-functions oracle11g ora-00600
我正在尝试在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
);
Run Code Online (Sandbox Code Playgroud)
CREATE OR REPLACE TYPE BODY SUM_AGGREGATOR_TYPE IS
STATIC FUNCTION ODCIAggregateInitialize(agg_context IN OUT
SUM_AGGREGATOR_TYPE)
RETURN NUMBER IS
BEGIN
agg_context := SUM_AGGREGATOR_TYPE(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT SUM_AGGREGATOR_TYPE,
next_number IN NUMBER)
RETURN NUMBER IS
BEGIN
IF self.summation IS NULL THEN
self.summation := next_number;
ELSIF summation IS NOT NULL THEN
self.summation := self.summation + next_number;
END IF;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT SUM_AGGREGATOR_TYPE,
para_context IN SUM_AGGREGATOR_TYPE)
RETURN NUMBER IS
BEGIN
self.summation := self.summation + para_context.summation;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN SUM_AGGREGATOR_TYPE,
return_value OUT NUMBER, flags IN NUMBER)
RETURN NUMBER IS
BEGIN
return_value := self.summation;
return ODCIConst.Success;
END;
END;
Run Code Online (Sandbox Code Playgroud)
如果我写下面的函数定义:
CREATE OR REPLACE FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
Run Code Online (Sandbox Code Playgroud)
和相应的类型声明来测试:
CREATE OR REPLACE TYPE VECTOR
IS
TABLE OF NUMBER;
Run Code Online (Sandbox Code Playgroud)
这个说法:
select my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
Run Code Online (Sandbox Code Playgroud)
给出70的正确结果.但是,创建一个包含函数定义的包:
CREATE OR REPLACE PACKAGE MY_FUNCTIONS AS
FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
END;
Run Code Online (Sandbox Code Playgroud)
并通过以下方式调用:
select MY_FUNCTIONS.my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
Run Code Online (Sandbox Code Playgroud)
与...爆炸
ORA-00600: internal error code, arguments: [17090], [], [], [], [], [], [], [], [], [], [], []
Run Code Online (Sandbox Code Playgroud)
是否可以将自定义聚合函数嵌套在包声明中?
Oracle使用ORA-00600来发出未处理的异常信号,即错误.第一个参数表示异常; ORA-17090是一种通用的"不允许操作".它们通常仅限于数据库版本和OS平台的特定排列.其他时候它只是意味着我们正在做一些非常不寻常的事情.
在包中包含自定义聚合函数是否算"非常不寻常"?不确定.当然,我们被允许在PL/SQL函数中包含数据盒式磁带功能.但是用户定义的聚合是ODCI的一个特例.虽然文档没有针对包的明确规则,但所有示例都实现了聚合使用CREATE FUNCTION.
那么该怎么办?好吧,ORA-00600消息需要Oracle支持的干预,因为它需要一个补丁.如果您有支持帐户,可以在此处找到有关此特定问题的更多信息.您需要提高iTAR才能获得进一步的解决方案.否则我恐怕你可能运气不好.