1

たとえば、平均、合計、またはカウントを計算するために、ユーザー定義の avg 関数を作成しようとしています。従うことができる例はありますか?

4

2 に答える 2

1

@David Aldridgeが述べたように、ユーザー定義の集計関数を構築する「公式の」方法は、Oracle Data Cartridgeを使用することです。しかし、私の経験では、この方法を使用する方が簡単で、高速で、バグが少ないCAST(COLLECTです。唯一の欠点は、SQL ステートメントに追加の構文が必要なことです。

たとえば、数値 1 を無視するカスタム平均関数を作成するには、次のようにします。

--Created nested table of numbers
create or replace type number_nt is table of number;

--Create a custom average function.
--For example, average everything except the number "1".
create or replace function my_avg(numbers number_nt) return number is
    v_sum number := 0;
    v_count number := 0;
begin
    --Sum and count all the values, excluding nulls and "1".
    for i in 1 .. numbers.count loop
        if numbers(i) is not null and numbers(i) <> 1 then
            v_sum := v_sum + numbers(i);
            v_count := v_count + 1;
        end if;
    end loop;

    if v_count = 0 then
        return null;
    else
        return v_sum/v_count;
    end if;
end;
/

関数を呼び出す方法は次のとおりです。

--Regular average is 2, our custom average that excludes 1 should be 2.5.
select
    avg(test_value) avg
    ,my_avg(cast(collect(test_value) as number_nt)) my_avg
from
(
    select 1 test_value from dual union all
    select 2 test_value from dual union all
    select 3 test_value from dual
);

AVG  MY_AVG
--   ------
2    2.5
于 2013-05-28T18:47:29.043 に答える
1

探しているのは、データ カートリッジ開発者ガイドに記載されているUser Defined Aggregates Function Interfaceです。

いくつかの例がここに文書化されています。

于 2013-05-28T16:43:09.657 に答える