create type list_t is varray (10) of number;
/
create or replace type medagg_t as object (
list_count number,
list_agg list_t,
static function ODCIAggregateInitialize(sctx in out medagg_t)
return number,
member function ODCIAggregateIterate(self in out medagg_t,
value in number) return number,
member function ODCIAggregateTerminate(self in medagg_t,
return_value out number, flags in number) return number,
member function ODCIAggregateMerge(self in out medagg_t,
ctx2 in medagg_t) return number
);
/
create or replace type body medagg_t is
static function ODCIAggregateInitialize(sctx in out medagg_t)
return number is
begin
sctx := medagg_t(0, null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(
self in out medagg_t, value in number)
return number is
insert_pt number;
begin
if list_agg is null then
list_agg := list_t(9999999,9999999,9999999,9999999,9999999,
9999999,9999999,9999999,9999999,9999999);
list_agg(1) := value;
list_count := 1;
return ODCIConst.Success;
end if;
insert_pt := 11;
for itemno in 1 .. 10
loop
if value < list_agg(itemno) then
insert_pt := itemno;
exit;
end if;
end loop;
if insert_pt = 11 then
return ODCIConst.Success;
end if;
if insert_pt = 10 then
list_agg(10) := value;
return ODCIConst.Success;
end if;
for itemno in reverse insert_pt .. 9
loop
list_agg(itemno + 1) := list_agg(itemno);
end loop;
list_agg(insert_pt) := value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self in medagg_t,
return_value out number, flags in number) return number is
begin
if list_agg is null then
return_value := 9999;
else
return_value := list_agg(5);
end if;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self in out medagg_t,
ctx2 in medagg_t) return number is
begin
return ODCIConst.Success;
end;
end;
/
create or replace function agg_median (input number) return number
parallel_enable aggregate using medagg_t;
/