非常感谢dingjun123!下面是我完成的结果:
create or replace type day_to_second_sum_type as object
( totalINTERVAL DAY(4) TO SECOND(6),
static function ODCIAggregateinitialize(sctx in out day_to_second_sum_type) return number,
member function ODCIAggregateIterate(self IN OUT day_to_second_sum_type,value IN interval day to second) return number,
member function ODCIAggregateTerminate(self IN day_to_second_sum_type,returnValue OUT interval day to second,flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT day_to_second_sum_type,ctx2 IN day_to_second_sum_type) return number
);
create or replace type body day_to_second_sum_type is
static function ODCIAggregateInitialize(sctx IN OUT day_to_second_sum_type) return number is
begin
sctx:= day_to_second_sum_type(numtodsinterval( 0,'SECOND'));
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT day_to_second_sum_type,value IN interval day to second) return number is
begin
self.total:=self.total+value;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN day_to_second_sum_type,returnValue OUT interval day to second,flags IN number) return number is
begin
returnValue:=self.total;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT day_to_second_sum_type,ctx2 IN day_to_second_sum_type) return number is
begin
self.total:=self.total+ctx2.total;
return ODCIConst.Success;
end;
end;
CREATE OR REPLACE FUNCTION ds_sum(input interval day to second) RETURN interval day to second
PARALLEL_ENABLE AGGREGATE USING day_to_second_sum_type;
select ds_sum(sosdxy) from dxy;
DS_SUM(sosdxy)
------------------------------------------------------
+000000001 08:09:59.984000000
[ 本帖最后由 sosdxy 于 2011-1-13 15:50 编辑 ]
|