您可以使用自己创建的聚合函数stragg来生成由逗号分隔的 CLOB 类型列表:
create or replace type string_agg_type as object
(
total CLOB,
static function ODCIAggregateInitialize(sctx IN OUT string_agg_type)
return number,
member function ODCIAggregateIterate(self IN OUT string_agg_type,
value IN CLOB) return number,
member function ODCIAggregateTerminate(self IN string_agg_type,
returnValue OUT CLOB,
flags IN number)
return number,
member function ODCIAggregateMerge(self IN OUT string_agg_type,
ctx2 IN string_agg_type) return number
)
/
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);
return odciconst.success;
end;
member function odciaggregateiterate(self IN OUT string_agg_type,
value IN CLOB) return number is
begin
self.total := CONCAT(CONCAT(self.total, to_clob(',')), 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 := CONCAT(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;
/
使用:
select stragg('test string') over (partition by 1 order by 1)
from dual
connect by level < 10000;