1) Добавить функцию для создания «текстового» представления объекта.
create or replace type objtype as object(
id int,
col1 varchar2(30),
col2 float,
member function toStr return varchar2
);
create or replace type body objtype is
member function toStr return varchar2 is
begin
return 'objtype('||self.id||','||col1||','||col2||')';
end;
end;
select listagg(t.col1.toStr(),', ') within group (order by 1) from myTab t;
2) Создание пользовательских агрегатов - сложный и мощный
ImpAggr реализует собственный механизм агрегирования.
create or replace type ImpAggr as object(
list_of_object varchar2(32000), -- second highest value seen so far
static function ODCIAggregateInitialize(sctx IN OUT ImpAggr)
return number,
member function ODCIAggregateIterate(self IN OUT ImpAggr,
value IN objtype) return number,
member function ODCIAggregateTerminate(self IN ImpAggr,
returnValue OUT varchar2, flags IN number) return number,
member function ODCIAggregateMerge(self IN OUT ImpAggr,
ctx2 IN ImpAggr) return number
);
/
create or replace type body ImpAggr is
static function ODCIAggregateInitialize(sctx IN OUT ImpAggr)
return number is
begin
-- Aggregate Initialize
sctx := ImpAggr(null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT ImpAggr, value IN objtype) return number is
begin
-- Aggregate Iterate
self.list_of_object :=list_of_object || ',objtype('||value.id||','||value.col1||','||value.col2||')';
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN ImpAggr,
returnValue OUT varchar2, flags IN number) return number is
begin
-- retrun result list_of_object.
returnValue := self.list_of_object;
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT ImpAggr, ctx2 IN ImpAggr) return number is
begin
-- merge content only if aggregation process gone in parallel execution
self.list_of_object := ','||ctx2.list_of_object;
return ODCIConst.Success;
end;
end;
/
Создать функцию агрегирования.
CREATE FUNCTION CustomAggregation (input objtype) RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING ImpAggr;
И использование.
select CustomAggregation(t.col1) from myTab t;