8

varray の集計関数を作成しようとしていますが、DB からのデータで使用しようとすると、次のエラー コードが表示されます。

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

誰かがそのようなことをしようとしたことがありますか?なぜうまくいかないと思いますか?

4

2 に答える 2

1

指摘されているように、これはORA-00600Oracle の内部バグです。それらには韻も理由もありません。唯一の真の修正は、Oracle からパッチを入手することです。

ただし... とはいえ... バグを回避するためにコードを少し調整することはしばしば可能です。

あなたの場合、これを行うことができます:

Select test_fn(cast(t1_value as test_vector)) 
from t1_test_table 
where t1_id = 1;

つまりtest_vector、ODCI集計に渡す前に、列を明示的にキャストします。

とにかく、これは12cで動作します。(そして、12c では、この修正を行わなくても ORA-00600 が発生します)。

于 2016-07-07T17:53:04.877 に答える