create or replace type body string_agg_type is static function ODCIAggregateInitialize(sctx IN OUT string_agg_type) return number is begin sctx := string_agg_type( null, 0 ); return ODCIConst.Success; end; member function ODCIAggregateIterate(self IN OUT string_agg_type, value IN varchar ) return number is begin self.total := self.total || ','; if (self.item_count > 5) THEN self.total := self.total || chr(13); self.item_count := 0; end if; self.item_count := self.item_count + 1; self.total := self.total || value; return ODCIConst.Success; end; member function ODCIAggregateTerminate(self IN string_agg_type, returnValue OUT clob, flags IN number) return number is begin returnValue := ltrim(self.total,','); return ODCIConst.Success; end; member function ODCIAggregateMerge(self IN OUT string_agg_type, ctx2 IN string_agg_type) return number is begin self.total := self.total || ctx2.total; return ODCIConst.Success; end; end; create or replace FUNCTION stragg(input varchar2 ) RETURN clob PARALLEL_ENABLE AGGREGATE USING string_agg_type;