輔助表(rul_sequence):
表中資料如圖:
輔助儲存過程(proc_getseqence):
create or replace procedure proc_getseqence(seqcode in varchar2,returnnum out varchar2,messagecode out varchar2 ) -- 異常訊息等
isseqnownumstr varchar2(20);
seqnownum int; --當前值
year char(4); --年 yyyy
month char(2); --月 mm
day char(2) ; --日 dd
nowlength int; --流水號長度
dataformat varchar2(50); --流水號規則
inivalue int; --歸零值
resettype varchar2(10); --歸零方式
lastdate char(8); --日期最大值
workflowstr varchar2(20); --前一次呼叫流水號時的日期值
datanow char(8); --當前日期
i int; --轉換變數,作用參照**上下文
begin
/* 初始化變數 */
messagecode:='888';--成功執行
returnnum := '0';
nowlength:=0;
seqnownum :=0;
datanow:=to_char(sysdate,'yyyymmdd'); --得到 20130704 的時間格式
year:=substr(datanow,1,4);
month :=substr(datanow,5,2);
day :=substr(datanow,7,2);
i:=1 ;
select value_length,now_seqvalue,date_max,data_format,reset_type,init_value
into nowlength,seqnownum,lastdate,dataformat,resettype,inivalue
from rul_sequence where seq_code=seqcode;
<>
update rul_sequence set is_running='2' where seq_code=seqcode and is_running='1';
if sql%rowcount=0 then
/***********如果有併發的正在執行,最多等待1秒,然後繼續執行 *******/
dbms_lock.sleep(1); --grant execute on dbms_lock to dhlink 需要授權
goto wait;
end if;
commit;
if (resettype=2 and datanow<>lastdate and inivalue>0)
or (resettype=3 and year||month<>substr(lastdate,1,6) and inivalue>0)
or (resettype=4 and year<>substr(lastdate,1,4) and inivalue>0 ) then
seqnownum:=inivalue;
end if;
i:=nowlength; --i 此時表示流水號的總長度
workflowstr:='
while nowlength>0
loop
workflowstr:=workflowstr||'x';
nowlength:=nowlength-1;
end loop;
workflowstr:=workflowstr||'>' ;
/***********拼流水號格式 end*******/
seqnownumstr:=to_char(seqnownum);
nowlength:=i-length(seqnownumstr);
/***********補零操作 start*******/
while nowlength>0
loop
seqnownumstr:='0'||seqnownumstr;
nowlength:=nowlength-1;
end loop;
/***********補零操作 end*******/
returnnum:=replace(dataformat,'',year); -- 把規則中替換成相應年
returnnum:=replace( returnnum,'',month); -- 把規則中替換成相應月
returnnum:=replace( returnnum,'',day); -- 把規則中替換成相應日
returnnum:=replace( returnnum,workflowstr,seqnownumstr);-- 把規則中的形如的替換成相應流水號,
/***********更新當前流水值為最大流水號、上乙個流水號生成時間和執行標記(執行標記置為"1"(沒有執行) ) start*******/
update rul_sequence set now_seqvalue=seqnownum+1,date_max=datanow,is_running='1', edit_time=sysdate
where is_running='2' and seq_code=seqcode;
commit;
/***********更新當前流水值為最大流水號、上乙個流水號生成時間和執行標記(執行標記置為"1"(沒有執行) ) end*******/
exception
when others then
rollback;
messagecode:='無此編號規則'||messagecode;
end proc_getseqence;
-- select * from rul_sequence
程式中呼叫:
輔助列舉:
#region 規則**(生成流水號的)
public enum flownorule
#endregion
函式:
public string getnextno(helper.enumhelper.flownorule rule)
;param[0].direction = parameterdirection.input;
param[0].value = rule.tostring();
param[1].direction = parameterdirection.output;
param[2].direction = parameterdirection.output;
oraclehelper.executenonquery(commandtype.storedprocedure, sql, param);
if (param[2].value.tostring() == "888")
else
}
Oracle流水號生成函式
使用oracle函式在建立表的時候自動加入生成的流水號 生成格式是 字首 年月日 00000 直接上 加注釋 create or replace function fn no make v type varchar2,v number col varchar2,v table name varcha...
Oracle 生成流水號函式
code sql code create or replace function fn no make v type varchar2,v number col varchar2,v table name varchar2 編碼示例 djjt12090600003 author rock.et cr...
Oracle生成流水號函式
1 日期範圍上 smalldatetime的有效時間範圍1900 1 1 2079 6 6datetime的有效時間範圍1753 1 1 9999 12 312 精準度上 smalldatetime只精準到分,而datetime則可精準到3位的毫秒。3 儲存空間上 smalldatetime占用4個...