create or replace type VAR_GROUP_OBJ as object (
sum_string VARCHAR2(4000),
static function ODCIAggregateInitialize(v_self in out VAR_GROUP_OBJ) return number,
member function ODCIAggregateIterate(self in out VAR_GROUP_OBJ, value in varchar2) return number,
member function ODCIAggregateMerge(self in out VAR_GROUP_OBJ, v_next in VAR_GROUP_OBJ) return number,
member function ODCIAggregateTerminate(self in VAR_GROUP_OBJ, return_value out VARCHAR2 ,v_flags in number) return number
)
/
create or replace type body VAR_GROUP_OBJ is
static function ODCIAggregateInitialize(v_self in out VAR_GROUP_OBJ) return number is
begin
v_self := VAR_GROUP_OBJ(null);
return ODCICONST.Success;
end;
member function ODCIAggregateIterate(self in out VAR_GROUP_OBJ, value in varchar2) return number is
begin
self.sum_string := self.sum_string || value||'|';
return ODCICONST.Success;
if self.sum_string<value then
self.sum_string:=value;
end if;
if self.sum_string>value then
self.sum_string:=value;
end if;
return ODCICONST.Success;
end;
member function ODCIAggregateMerge(self in out VAR_GROUP_OBJ, v_next in VAR_GROUP_OBJ) return number is
begin
self.sum_string := self.sum_string ||v_next.sum_string;
return ODCICONST.Success;
if self.sum_string<v_next.sum_string then
self.sum_string:=v_next.sum_string;
end if;
if self.sum_string>v_next.sum_string then
self.sum_string:=v_next.sum_string;
end if;
return ODCICONST.Success;
end;
member function ODCIAggregateTerminate(self in VAR_GROUP_OBJ, return_value out VARCHAR2 ,v_flags in number) return number is
begin
return_value:= self.sum_string;
return ODCICONST.Success;
end;
end;
/
create or replace function GROUPCATVAR(value varchar2) return VARCHAR2
parallel_enable aggregate using VAR_GROUP_OBJ;
|