|
聚合位操作可以类似实现。但有什么实际作用呢?
聚合AND操作:
create or replace type and_agg_type as object
(
total NUMBER,
static function
ODCIAggregateInitialize(sctx IN OUT and_agg_type )
return number,
member function
ODCIAggregateIterate(self IN OUT and_agg_type ,
value IN NUMBER )
return number,
member function
ODCIAggregateTerminate(self IN and_agg_type,
returnValue OUT NUMBER,
flags IN number)
return number,
member function
ODCIAggregateMerge(self IN OUT and_agg_type,
ctx2 IN and_agg_type)
return number
);
/
create or replace type body and_agg_type
is
static function ODCIAggregateInitialize(sctx IN OUT and_agg_type)
return number
is
begin
sctx := and_agg_type( null );
sctx.total :=1;
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT and_agg_type,
value IN NUMBER )
return number
is
begin
self.total := BITAND(self.total, value);
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN and_agg_type,
returnValue OUT NUMBER,
flags IN number)
return number
is
begin
returnValue := self.total;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT and_agg_type,
ctx2 IN and_agg_type)
return number
is
begin
self.total := BITAND(self.total, ctx2.total);
return ODCIConst.Success;
end;
end;
/
CREATE or replace
FUNCTION and_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING and_agg_type;
/
聚合OR操作:
create or replace type or_agg_type as object
(
total NUMBER,
static function
ODCIAggregateInitialize(sctx IN OUT or_agg_type )
return number,
member function
ODCIAggregateIterate(self IN OUT or_agg_type ,
value IN NUMBER )
return number,
member function
ODCIAggregateTerminate(self IN or_agg_type,
returnValue OUT NUMBER,
flags IN number)
return number,
member function
ODCIAggregateMerge(self IN OUT or_agg_type,
ctx2 IN or_agg_type)
return number
);
/
create or replace type body or_agg_type
is
static function ODCIAggregateInitialize(sctx IN OUT or_agg_type)
return number
is
begin
sctx := or_agg_type( null );
sctx.total :=0;
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT or_agg_type,
value IN NUMBER )
return number
is
begin
self.total := self.total + value - BITAND(self.total, value);
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN or_agg_type,
returnValue OUT NUMBER,
flags IN number)
return number
is
begin
returnValue := self.total;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT or_agg_type,
ctx2 IN or_agg_type)
return number
is
begin
self.total := self.total + ctx2.total - BITAND(self.total, ctx2.total);
return ODCIConst.Success;
end;
end;
/
CREATE or replace
FUNCTION or_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING or_agg_type;
/
聚合XOR操作:
create or replace type xor_agg_type as object
(
total NUMBER,
static function
ODCIAggregateInitialize(sctx IN OUT xor_agg_type )
return number,
member function
ODCIAggregateIterate(self IN OUT xor_agg_type ,
value IN NUMBER )
return number,
member function
ODCIAggregateTerminate(self IN xor_agg_type,
returnValue OUT NUMBER,
flags IN number)
return number,
member function
ODCIAggregateMerge(self IN OUT xor_agg_type,
ctx2 IN xor_agg_type)
return number
);
/
create or replace type body xor_agg_type
is
static function ODCIAggregateInitialize(sctx IN OUT xor_agg_type)
return number
is
begin
sctx := xor_agg_type( null );
sctx.total :=0;
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT xor_agg_type,
value IN NUMBER )
return number
is
begin
self.total := self.total + value - BITAND(self.total, value)*2;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN xor_agg_type,
returnValue OUT NUMBER,
flags IN number)
return number
is
begin
returnValue := self.total;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT xor_agg_type,
ctx2 IN xor_agg_type)
return number
is
begin
self.total := self.total + ctx2.total - BITAND(self.total, ctx2.total)*2;
return ODCIConst.Success;
end;
end;
/
CREATE or replace
FUNCTION xor_agg(input NUMBER )
RETURN NUMBER
PARALLEL_ENABLE AGGREGATE USING xor_agg_type;
/ |
|