我正在尝试为varray编写一些聚合函数,当我尝试将它与数据库中的数据一起使用时,我得到了这个错误代码:
ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], []
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], []
函数的代码非常简单(实际上它什么都不做):
create or replace
TYPE "TEST_VECTOR" as varray(10) of varchar(20)
ALTER TYPE "TEST_VECTOR" MODIFY LIMIT 4000 CASCADE
create or replace
type Test as object(
lastVector TEST_VECTOR,
STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number,
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT Test, ctx2 IN Test) return number,
MEMBER FUNCTION ODCIAggregateTerminate(self IN Test, returnValue OUT TEST_VECTOR, flags IN number) return number
);
create or replace
type body Test is
STATIC FUNCTION ODCIAggregateInitialize(sctx in out Test) return number is
begin
sctx := Test(TEST_VECTOR());
return ODCIConst.Success;
end;
MEMBER FUNCTION ODCIAggregateIterate(self in out Test, value in TEST_VECTOR) return number is
begin
self.lastVector := value;
return ODCIConst.Success;
end;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT Test, ctx2 IN Test) return number is
begin
return ODCIConst.Success;
end;
MEMBER FUNCTION ODCIAggregateTerminate(self IN Test, returnValue OUT TEST_VECTOR, flags IN number) return number is
begin
returnValue := self.lastVector;
return ODCIConst.Success;
end;
end;
create or replace
FUNCTION test_fn (input TEST_VECTOR) RETURN TEST_VECTOR
PARALLEL_ENABLE AGGREGATE USING Test;
接下来我创建一些测试数据:
create table t1_test_table(
t1_id number not null,
t1_value TEST_VECTOR not null,
Constraint PRIMARY_KEY_1 PRIMARY KEY (t1_id)
)
下一步是将一些数据放到表中
insert into t1_test_table (t1_id,t1_value) values (1,TEST_VECTOR('x','y','z'))
现在一切准备好执行查询:
Select test_fn(TEST_VECTOR('y','x')) from dual
以上查询工作正常
Select test_fn(t1_value) from t1_test_table where t1_id = 1
我使用的Oracle DBMS版本:11.2.0.3.0
有没有人尝试做过这样的事情? 为什么你认为它不起作用?
答案 0 :(得分:1)
如前所述,ORA-00600
是一个内部Oracle错误。他们没有押韵或理由,唯一真正的解决方法是从Oracle获得补丁。
然而......所有人都说...通常可以稍微调整你的代码以避免这个错误。
在您的情况下,您可以这样做:
Select test_fn(cast(t1_value as test_vector))
from t1_test_table
where t1_id = 1;
也就是说,在将列传递给ODCI聚合之前,将列显式地转换为test_vector
。
无论如何,这在12c中有效。 (并且,在12c中,你也会得到没有这个修复的ORA-00600。)
答案 1 :(得分:-5)
“ORA-00600内部错误代码,参数:”,表示某些块在内部损坏,尝试恢复系统表空间和特定用户表空间。