私は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 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;
:
CREATE OR REPLACE FUNCTION MY_SUM(input NUMBER)
RETURN NUMBER PARALLEL_ENABLE AGGREGATE USING SUM_AGGREGATOR_TYPE;
および対応する型宣言:
CREATE OR REPLACE TYPE VECTOR
IS
TABLE OF NUMBER;
この文:
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));
爆発
select my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));
は、関数定義でパッケージを作成し、しかし70の正確な結果を与えます
ORA-00600: internal error code, arguments: [17090], [], [], [], [], [], [], [], [], [], [], []
カスタム集計関数をパッケージ宣言内にネストすることは可能ですか?
'ORA-00600'は通常、予期しない機能の組み合わせのためにOracleバグを示します。どのようなOracleの正確なバージョンを実行していますか? –
私はOracle 11g Release 2(11.2.0.1.0)を使用しています。 – wcmatthysen
この問題に関するニュースはありますか?私も問題があります。しかし、私の場合、接続は 'ORA-03113:通信チャネル上のファイルの終わり 'に打ち切られます。私はこれが 'ORA-00600'よりもさらに悪いと思う。 'SELECT * FROM ALL_PROCEDURES'をチェックすると、ユーザ定義集計が正しく作成され、登録されていることがわかります... –