Oracle 生成流水號

2021-06-21 11:04:54 字數 3805 閱讀 9226

輔助表(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個...