Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Functions for INTERVAL DAY TO SECOND and INTERVAL YEAR TO MONTH types #30

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
209 changes: 209 additions & 0 deletions ora/interval_agg.pkb
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
/*

Purpose: Types used by the interval aggregate functions

Remarks:

Who Date Description
------ ---------- -------------------------------------
AJM 14.09.2015 Created

*/

create or replace type body t_sum_dsinterval
as

static function ODCIAggregateInitialize (actx in out t_sum_dsinterval) return number
as
begin

if actx is null then
actx := t_sum_dsinterval (interval '0 0:0:0.0' day to second);
else
actx.runningsum := interval '0 0:0:0.0' day to second;
end if;
return ODCIConst.Success;

end ODCIAggregateInitialize;

member function ODCIAggregateIterate (self in out t_sum_dsinterval,
val in dsinterval_unconstrained) return number as
begin

self.runningsum := self.runningsum + val;
return ODCIConst.Success;

end ODCIAggregateIterate;

member function ODCIAggregateMerge (self in out t_sum_dsinterval,
ctx2 in t_sum_dsinterval) return number as
begin

self.runningsum := self.runningsum + ctx2.runningsum;
return ODCIConst.Success;

end ODCIAggregateMerge;

member function ODCIAggregateTerminate (self in t_sum_dsinterval,
returnvalue out dsinterval_unconstrained,
flags in number) return number as
begin

returnvalue := self.runningsum;
return ODCIConst.Success;

end ODCIAggregateTerminate;
end;
/

create or replace type body t_avg_dsinterval
as

static function ODCIAggregateInitialize (actx in out t_avg_dsinterval) return number
as
begin

if actx is null then
actx := t_avg_dsinterval (interval '0 0:0:0.0' day to second, 0);
else
actx.runningsum := interval '0 0:0:0.0' day to second;
actx.runningcount := 0;
end if;
return ODCIConst.Success;

end ODCIAggregateInitialize;

member function ODCIAggregateIterate (self in out t_avg_dsinterval,
val in dsinterval_unconstrained) return number as
begin

self.runningsum := self.runningsum + val;
self.runningcount := self.runningcount + 1;
return ODCIConst.Success;

end ODCIAggregateIterate;

member function ODCIAggregateMerge (self in out t_avg_dsinterval,
ctx2 in t_avg_dsinterval) return number as
begin

self.runningsum := self.runningsum + ctx2.runningsum;
self.runningcount := self.runningcount + ctx2.runningcount;
return ODCIConst.Success;

end ODCIAggregateMerge;

member function ODCIAggregateTerminate (self in t_avg_dsinterval,
returnvalue out dsinterval_unconstrained,
flags in number) return number as
begin

if self.runningcount <> 0 then
returnvalue := self.runningsum / self.runningcount;
else
returnvalue := self.runningsum;
end if;
return ODCIConst.Success;

end ODCIAggregateTerminate;
end;
/

create or replace type body t_sum_yminterval
as

static function ODCIAggregateInitialize (actx in out t_sum_yminterval) return number
as
begin

if actx is null then
actx := t_sum_yminterval (interval '0-00' year to month);
else
actx.runningsum := interval '0-00' year to month;
end if;
return ODCIConst.Success;

end ODCIAggregateInitialize;

member function ODCIAggregateIterate (self in out t_sum_yminterval,
val in yminterval_unconstrained) return number as
begin

self.runningsum := self.runningsum + val;
return ODCIConst.Success;

end ODCIAggregateIterate;

member function ODCIAggregateMerge (self in out t_sum_yminterval,
ctx2 in t_sum_yminterval) return number as
begin

self.runningsum := self.runningsum + ctx2.runningsum;
return ODCIConst.Success;

end ODCIAggregateMerge;

member function ODCIAggregateTerminate (self in t_sum_yminterval,
returnvalue out yminterval_unconstrained,
flags in number) return number as
begin

returnvalue := self.runningsum;
return ODCIConst.Success;

end ODCIAggregateTerminate;
end;
/

create or replace type body t_avg_yminterval
as

static function ODCIAggregateInitialize (actx in out t_avg_yminterval) return number
as
begin

if actx is null then
actx := t_avg_yminterval (interval '0-00' year to month, 0);
else
actx.runningsum := interval '0-00' year to month;
actx.runningcount := 0;
end if;
return ODCIConst.Success;

end ODCIAggregateInitialize;

member function ODCIAggregateIterate (self in out t_avg_yminterval,
val in yminterval_unconstrained) return number as
begin

self.runningsum := self.runningsum + val;
self.runningcount := self.runningcount + 1;
return ODCIConst.Success;

end ODCIAggregateIterate;

member function ODCIAggregateMerge (self in out t_avg_yminterval,
ctx2 in t_avg_yminterval) return number as
begin

self.runningsum := self.runningsum + ctx2.runningsum;
self.runningcount := self.runningcount + ctx2.runningcount;
return ODCIConst.Success;

end ODCIAggregateMerge;

member function ODCIAggregateTerminate (self in t_avg_yminterval,
returnvalue out yminterval_unconstrained,
flags in number) return number as
begin

if self.runningcount <> 0 then
returnvalue := self.runningsum / self.runningcount;
else
returnvalue := self.runningsum;
end if;
return ODCIConst.Success;

end ODCIAggregateTerminate;
end;
/
81 changes: 81 additions & 0 deletions ora/interval_agg.pks
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
/*

Purpose: Types used by the interval aggregate functions

Remarks:

Who Date Description
------ ---------- -------------------------------------
AJM 14.09.2015 Created

*/

create or replace type t_sum_dsinterval as object (
runningsum interval day(9) to second(9),

static function ODCIAggregateInitialize (actx in out t_sum_dsinterval) return number,

member function ODCIAggregateIterate (self in out t_sum_dsinterval,
val in dsinterval_unconstrained) return number,

member function ODCIAggregateMerge (self in out t_sum_dsinterval,
ctx2 in t_sum_dsinterval) return number,

member function ODCIAggregateTerminate (self in t_sum_dsinterval,
returnvalue out dsinterval_unconstrained,
flags in number) return number
);
/

create or replace type t_avg_dsinterval as object (
runningsum interval day(9) to second(9),
runningcount number,

static function ODCIAggregateInitialize (actx in out t_avg_dsinterval) return number,

member function ODCIAggregateIterate (self in out t_avg_dsinterval,
val in dsinterval_unconstrained) return number,

member function ODCIAggregateMerge (self in out t_avg_dsinterval,
ctx2 in t_avg_dsinterval) return number,

member function ODCIAggregateTerminate (self in t_avg_dsinterval,
returnvalue out dsinterval_unconstrained,
flags in number) return number
);
/

create or replace type t_sum_yminterval as object (
runningsum interval year(9) to month,

static function ODCIAggregateInitialize (actx in out t_sum_yminterval) return number,

member function ODCIAggregateIterate (self in out t_sum_yminterval,
val in yminterval_unconstrained) return number,

member function ODCIAggregateMerge (self in out t_sum_yminterval,
ctx2 in t_sum_yminterval) return number,

member function ODCIAggregateTerminate (self in t_sum_yminterval,
returnvalue out yminterval_unconstrained,
flags in number) return number
);
/

create or replace type t_avg_yminterval as object (
runningsum interval year(9) to month,
runningcount number,

static function ODCIAggregateInitialize (actx in out t_avg_yminterval) return number,

member function ODCIAggregateIterate (self in out t_avg_yminterval,
val in yminterval_unconstrained) return number,

member function ODCIAggregateMerge (self in out t_avg_yminterval,
ctx2 in t_avg_yminterval) return number,

member function ODCIAggregateTerminate (self in t_avg_yminterval,
returnvalue out yminterval_unconstrained,
flags in number) return number
);
/
35 changes: 35 additions & 0 deletions ora/interval_agg.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/*

Purpose: Interval aggregate functions

Remarks:

Who Date Description
------ ---------- -------------------------------------
AJM 14.09.2015 Created

*/

-- sum aggregate function for interval day to second
create or replace function sum_dsinterval (x dsinterval_unconstrained) return dsinterval_unconstrained
parallel_enable
aggregate using t_sum_dsinterval;
/

-- average aggregate function for interval day to second
create or replace function avg_dsinterval (x dsinterval_unconstrained) return dsinterval_unconstrained
parallel_enable
aggregate using t_avg_dsinterval;
/

-- sum aggregate function for interval year to month
create or replace function sum_yminterval (x yminterval_unconstrained) return yminterval_unconstrained
parallel_enable
aggregate using t_sum_yminterval;
/

-- average aggregate function for interval year to month
create or replace function avg_yminterval (x yminterval_unconstrained) return yminterval_unconstrained
parallel_enable
aggregate using t_avg_yminterval;
/
Loading