ID NAME
---------- --------------------
1 AAA
2 BBB
1 ABC
3 CCC
2 DDD
SQL> select id, f_sumstr(name) name from test group by id;
ID NAME
---------- ------------------------------------------------------
1 AAAABC
2 BBBDDD
3 CCC
create or replace type SumStr as object
(
str varchar2(30000),
static function odciaggregateinitialize(sctx in out SumStr) return number,
member function odciaggregateiterate(self in out SumStr, value in varchar2) return number,
member function odciaggregateterminate(self in out SumStr, returnvalue out varchar2, flags in number) return number,
member function odciaggregatemerge(self in out SumStr, ctx2 in SumStr) return number
)
/
create or replace type body SumStr is
static function odciaggregateinitialize(sctx in out SumStr)
return number is
begin
sctx := SumStr(null);
return odciconst.Success;
end;
member function odciaggregateiterate(self in out SumStr, value in varchar2)
return number is
begin
self.str := self.str || value;
return odciconst.Success;
end;
member function odciaggregateterminate(self in out SumStr, returnvalue out varchar2, flags in number)
return number is
begin
returnvalue := self.str;
return odciconst.Success;
end;
member function odciaggregatemerge(self in out SumStr, ctx2 in SumStr)
return number is
begin
null;
return odciconst.Success;
end;
end;
/
create or replace function F_SumStr(p_str varchar2) return varchar2
aggregate using SumStr;