--建立函數類型
create type strcat_type as object (
cat_string varchar2(4000),
--自訂聚集合函式初始化設定,從這兒開始一個聚集合函式
static function ODCIAggregateInitialize(cs_ctx In Out strcat_type) return number,
--自訂聚集合函式,最主要的步驟,這個函數定義我們的聚集合函式具體做什麼操作,後面的例子,是取最大值,最小值,平均值,還是做串連操作.self 為當前聚集合函式的指標,用來與前面的計算結果進行關聯
member function ODCIAggregateIterate(self In Out strcat_type,value in varchar2) return number,
--用來合并兩個聚集合函式的兩個不同的指標對應的結果,使用者合并不同結果結的資料,特別是處理並行(parallel)查詢聚集合函式的時候.
member function ODCIAggregateMerge(self In Out strcat_type,ctx2 In Out strcat_type) return number,
--終止聚集合函式的處理,返回聚集合函式處理的結果
member function ODCIAggregateTerminate(self In Out strcat_type,returnValue Out varchar2,flags in number) return number
)
--/*
--函數主體
*/
create or replace type body strcat_type is
static function ODCIAggregateInitialize(cs_ctx IN OUT strcat_type) return number
is
begin
cs_ctx := strcat_type(null);
return ODCIConst.Success;
end;
member function ODCIAggregateIterate(self IN OUT strcat_type,
value IN varchar2 )
return number
is
begin
self.cat_string := self.cat_string|| value;
-- 2.get union set
-- if instr(self.cat_string, value ) = 0 or self.cat_string is null then
-- self.cat_string := self.cat_string || ',' || value ;
-- else
-- self.cat_string := self.cat_string ||'' ;
-- end if ;
return ODCIConst.Success;
end;
member function ODCIAggregateTerminate(self IN Out strcat_type,
returnValue OUT varchar2,
flags IN number)
return number
is
begin
returnValue := ltrim(rtrim(self.cat_string,','),',');
return ODCIConst.Success;
end;
member function ODCIAggregateMerge(self IN OUT strcat_type,
ctx2 IN Out strcat_type)
return number
is
begin
self.cat_string := self.cat_string || ',' || ctx2.cat_string;
return ODCIConst.Success;
end;
end;
/*
函數調用
*/
CREATE or replace
FUNCTION strcat(input varchar2 )
RETURN varchar2
PARALLEL_ENABLE AGGREGATE USING strcat_type;