3

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;

この文:

select my_sum(column_value) from table(vector(1, 2, 1, 45, 22, -1));

70の正しい結果が得られます。ただし、関数定義を使用してパッケージを作成します。

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));

で爆発する

ORA-00600: internal error code, arguments: [17090], [], [], [], [], [], [], [], [], [], [], [] 

パッケージ宣言内にカスタム集計関数をネストすることは可能ですか?

4

1 に答える 1

7

Oracleは、ORA-00600を使用して、未処理の例外、つまりバグを通知します。最初の引数は例外を示します。ORA-17090は、一般的な「操作は許可されていません」です。多くの場合、それらはデータベースバージョンとOSプラットフォームの特定の順列に制限されています。また、それは単に私たちが本当に変わったことをしていることを意味します。

パッケージ内にカスタム集計関数を含めることは「本当に珍しい」と見なされますか?わからない。確かに、PL/SQL関数にデータカートリッジ関数を含めることは許可されています。ただし、ユーザー定義の集計はODCIの特殊なケースです。ドキュメントにはパッケージに対する明示的なルールはありませんが、すべての例で.を使用して集計を実装していCREATE FUNCTIONます。

じゃあ何をすればいいの?パッチが必要なため、ORA-00600メッセージにはOracleサポートの介入が必要です。サポートアカウントをお持ちの場合は、この特定の問題について詳しくはこちらをご覧ください。さらに解決するには、iTARを上げる必要があります。そうでなければ、あなたはおそらく運が悪いのではないかと思います。

于 2010-11-30T05:30:46.833 に答える