自定義Oracle聚合函式(多引數)

2021-10-01 18:02:28 字數 3272 閱讀 1313

直接上**,看注釋吧。

select zh_concat_str(concat_str(value, separator, orderby)) from dual;

--①建立乙個物件型別,用以傳遞多個引數

create or replace type concat_str as object(

value varchar2(4000),/*聚合字段*/

separator varchar2(100),/*分隔符*/

orderby varchar2(100)/*排序字段*/

);--②建立乙個該物件的陣列,儲存傳遞的物件

create or replace type concat_str_array is table of concat_str;

--③建立聚合函式(型別頭)

create or replace type concat_str_im

authid current_user as object

( str_array concat_str_array,

--初始化

static function odciaggregateinitialize(sctx in out concat_str_im) return number,

--迭代方法

member function odciaggregateiterate(self in out concat_str_im, p1 in concat_str) return number,

--返回結果

member function odciaggregateterminate(self in concat_str_im, returnvalue out varchar2, flags in number) return number,

--合併不同指標對應的結果(並行查詢)

member function odciaggregatemerge(self in out concat_str_im, sctx2 in concat_str_im) return number

);--④建立聚合函式(型別體)

create or replace type body concat_str_im

is static function odciaggregateinitialize(sctx in out concat_str_im)

return number

isbegin

sctx := concat_str_im(concat_str_array()) ;/*初始化物件陣列*/

return odciconst.success;

end;

member function odciaggregateiterate(self in out concat_str_im,

p1 in concat_str)

return number

isbegin

str_array.extend;

str_array(str_array.count) := p1;/*物件陣列儲存聚合物件*/

return odciconst.success;

end;

/*member function odciaggregateterminate(self in concat_str_im,

returnvalue out clob,--返回結果,當前是clob

flags in number)

return number

islen number;

begin

--迴圈聚合陣列,取出聚合字段根據分隔符聚合

select count(*) into len from table(str_array);

dbms_lob.createtemporary ( returnvalue , true);

for x in (select rownum,value,separator from table(str_array) order by orderby) loop

if len = x.rownum then

else

end if;

end loop;

return odciconst.success;

end;

*/member function odciaggregateterminate(self in concat_str_im,

returnvalue out varchar2,/*返回結果,當前是字串,有長度限制,也可以使用clob*/

flags in number)

return number

islen number;

begin

/*迴圈聚合陣列,取出聚合字段根據分隔符聚合*/

select count(*) into len from table(str_array);

for x in (select rownum,value,separator from table(str_array) order by orderby) loop

if len = x.rownum then

returnvalue := returnvalue || x.value;

else

returnvalue := returnvalue || x.value || x.separator;

end if;

end loop;

return odciconst.success;

end;

member function odciaggregatemerge(self in out concat_str_im,

sctx2 in concat_str_im)

return number

isbegin

/*兩個聚合陣列的拼接*/

for i in 1..sctx2.str_array.count loop

str_array.extend;

str_array(str_array.count) := sctx2.str_array(i);

end loop;

return odciconst.success;

end;

end;

--⑤建立呼叫方法(最終使用的方法)

create or replace function zh_concat_str(p1 concat_str)

return varchar2 aggregate using concat_str_im ;

參考:

oracle 自定義 group 聚合函式

create or replace type clob group obj as object sum string clob,static function odciaggregateinitialize v self in out clob group obj return number,mem...

自定義聚合函式

新建database project 新建concatenate class using system using system.data using microsoft.sqlserver.server using system.data.sqltypes using system.io usin...

自定義聚合函式

create or replace type string sum obj as object 聚合函式的實質就是乙個物件 sum string varchar2 4000 static function odciaggregateinitialize v self in out string su...