如何在oracle中编写用户定义的平均函数

时间:2013-05-28 16:23:13

标签: oracle user-defined-functions

我正在尝试创建一个用户定义的avg函数,例如计算平均值,总和或计数 - 我可以遵循任何例子吗?

2 个答案:

答案 0 :(得分:1)

您正在寻找的是数据盒式开发者指南中记录的User Defined Aggregates Function Interface

记录了一些例子here

答案 1 :(得分: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