Oracle用户为varchar的varray定义了聚合函数

baj*_*aju 8 oracle aggregate-functions oracle11g varray

我正在尝试为varray编写一些聚合函数,当我尝试将它与数据库中的数据一起使用时,我得到了这个错误代码:

ORA-00600 internal error code, arguments: [kodpunp1], [], [], [], [], [], [], [], [], [], [], []
[koxsihread1], [0], [3989], [45778], [], [], [], [], [], [], [], []
Run Code Online (Sandbox Code Playgroud)

函数的代码非常简单(事实上它什么都不做):

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;
Run Code Online (Sandbox Code Playgroud)

接下来我创建一些测试数据:

create table t1_test_table(
  t1_id number not null,
  t1_value TEST_VECTOR not null,
  Constraint PRIMARY_KEY_1 PRIMARY KEY (t1_id)
)
Run Code Online (Sandbox Code Playgroud)

下一步是将一些数据放到表中

insert into t1_test_table (t1_id,t1_value) values (1,TEST_VECTOR('x','y','z'))
Run Code Online (Sandbox Code Playgroud)

现在一切都准备好执行查询:

Select test_fn(TEST_VECTOR('y','x')) from dual
Run Code Online (Sandbox Code Playgroud)

上面的查询效果很好

Select test_fn(t1_value) from t1_test_table where t1_id = 1
Run Code Online (Sandbox Code Playgroud)

我使用的Oracle DBMS版本:11.2.0.3.0

有没有人试过做这样的事情?为什么你认为它不起作用?

小智 -5

“ORA-00600内部错误代码,参数:”,它表明某些块在内部损坏,尝试恢复系统表空间和特定用户表空间。

  • -1 这个答案无助于解决这个问题,而且一般来说是个不好的建议。可以使用提供的示例数据重现该问题,没有损坏的块。ORA-00600只是意味着Oracle错误,并不一定意味着数据有问题。 (7认同)
  • ORA-00600 是 Oracle 针对未处理的内部异常(即 bug)的通用代码。损坏的块是 ORA-00600 错误的可能来源之一,但还有许多其他错误。参数表明具体原因。建议采取的措施是致电 Oracle 支持人员,因为该解决方案可能需要补丁。 (2认同)