重寫oraclewm contact函式指令碼

2021-12-30 11:52:28 字數 4820 閱讀 3895

最近專案上有個要求,要把連續的卡號使用乙個段來描述,比如:1,2,3,4,5,8,10,13,14,15,16 要顯示成:1-5,8,10,13-16的形式

但是原有的wm_contact函式是用逗號隔開,並沒有該功能,我在網上蒐集了點資料,自己再修改了點東西,滿足了這個需求,下面看**:

此**是重寫 wm_contact 函式的主要**,指令碼中 fun_join_str(curr_str,'-') 函式是我自定義的函式

create or replace type zh_concat_im

authid current_user as object

( curr_str clob,

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

member function odciaggregateiterate(self in out zh_concat_im,

p1 in varchar2) return number,

member function odciaggregateterminate(self in zh_concat_im,

returnvalue out varchar2,

flags in number)

return number,

member function odciaggregatemerge(self in out zh_concat_im,

sctx2 in zh_concat_im) return number);/

create or replace type body zh_concat_im

is static function odciaggregateinitialize(sctx in out zh_concat_im)

return number

isbegin

sctx := zh_concat_im(null) ;

return odciconst.success;

end;

member function odciaggregateiterate(self in out zh_concat_im,

p1 in varchar2)

return number

isbegin

--dbms_output.put_line(curr_str||'|'||p1);

if(curr_str is not null) then

curr_str := curr_str || ',' || p1;

else

curr_str := p1;

end if;

return odciconst.success;

end;

member function odciaggregateterminate(self in zh_concat_im,

returnvalue out varchar2,

flags in number)

return number

isbegin

returnvalue :=fun_join_str(curr_str,'-'); --此處要在該函式返回之前再進行一次處理

return odciconst.success;

end;

member function odciaggregatemerge(self in out zh_concat_im,

sctx2 in zh_concat_im)

return number

isbegin

if(sctx2.curr_str is not null) then

self.curr_str := self.curr_str || ',' || sctx2.curr_str ;

end if;

return odciconst.success;

end;

end;

/create or replace function zh_concat(p1 varchar2)

return varchar2 aggregate using zh_concat_im;

/以下是自定義函式部分,主要完成排序和拼接

create or replace type t_ret_table is table of varchar2(30);--定義型別

/create or replace function fun_strsplit_table(v_str in clob,

var_split in varchar2)

return t_ret_table

pipelined is

var_tmp clob;

var_element varchar2(30);

n_length number := length(var_split);

begin

var_tmp := v_str||',';

while instr(var_tmp, var_split) > 0 loop

var_element := substr(var_tmp, 1, instr(var_tmp, var_split) - 1);

var_tmp := substr(var_tmp,

instr(var_tmp, var_split) + n_length,

length(var_tmp));

pipe row(var_element);

end loop;

return;

end fun_strsplit_table;

/create or replace function fun_join_str(v_source_str in clob,

v_join_str in varchar2)

return clob is

v_result clob;

v_str_arry t_ret_table;

v_minus integer;

v_count integer := 0;

v_range_str varchar2(50);

begin

select column_value bulk collect

into v_str_arry

from table(fun_strsplit_table(v_source_str, ','))

order by column_value;

for n in 1 .. v_str_arry.count loop

if n = 1 then

v_result := v_str_arry(n);

v_range_str :=v_result;

end if;

if n > 1 then

v_minus := to_number(v_str_arry(n)) - to_number(v_str_arry(n - 1));

if v_minus > 1 then

if v_count > 1 then

v_result := v_result||','||v_range_str||v_join_str||v_str_arry(n-1);

v_count := 0;

else

v_result := v_result|| ','|| v_str_arry(n);

end if;

v_range_str :=v_str_arry(n);

else

v_count := v_count + 1;

end if;

end if;

end loop;

if v_count>0 then

v_result := v_result||','||v_range_str||v_join_str||v_str_arry(v_str_arry.count);

end if;

return(v_result);

end fun_join_str;

/呼叫示例:

select zh_concat(a.cardno) from cm_carddata a where a.sessionnumber=117 group by a.cm_base_cardtypeoid;

使用wm_contact 輸出的資料如下:

9007001,9900011,9700009,9700001,9700011,9700002,9700008,9700003,9700012,9990007,9990006,9990005,9990004,9990003,9990002,9990001,9650201,9700013,9911021,9700006,9780040,9780044,9911021,9464603,9464601,9214509,9214510,9780046,9780057,9780056,9780055,9900082,9780054,9780045,9780043,9780042,9700007,9780041,9780053,9780052,9780051,9990014,9990013,9990012,9990011,9650126,9700005,9700004,9990010,9990009,9990008

使用zh_contact 函式輸出的資料如下:

9007001,9214509,9464601,9464603,9650126,9650201,9700001,9700001-9700009,9700011-9700013,9780040-9780046,9780051-9780057,9900082,9911021,9990001,9990001-9990014

IDEA 重寫equals重寫toString

重寫equals方法 idea中直接輸入eq回車進入重寫方法 第二步如果obj這個物件連學生 student 這個型別都不是,那麼肯定返回false if obj instanceof student 第三步如果是學生型別,強制把obj轉換成學生物件,不轉換預設是objeke student s s...

重寫equals為啥需要重寫hashCode

以前一直記得重寫equals要把hashcode也要重寫了,但是一直也是沒有搞明白,最近在看一些東西,覺得有必要記錄一下。equals是object類的方法,這個方法的作用是比較兩個物件是否相等的,可能有人會問了,使用 號不就可以比較了,為啥非得使用equals方法呢。假設你有乙個student類,...

重寫equals時還必須重寫hashCode方法

1.public boolean equals object obj 和 hashcode 方法是object物件中的方法 2.equals 與 hashcode間的關係是這樣的 a.如果兩個物件相同 即用equals比較返回true,那麼它們的 hashcode 值一定要相同 b.如果兩個物件的 ...