最近專案上有個要求,要把連續的卡號使用乙個段來描述,比如: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.如果兩個物件的 ...