標籤:
規則表中的資料:
產生流水號輔助的預存程序:
CREATE OR REPLACE PROCEDURE Proc_GetSeqence(SeqCode in varchar2,ReturnNum out Varchar2,MessageCode out varchar2 ) -- 異常訊息等isseqNowNumStr VARCHAR2(20);SeqNowNum int; --當前值year CHAR(4); --年 YYYYmonth CHAR(2); --月 MMday CHAR(2) ; --日 DDNowLength 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; <<wait>> 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,‘<YYYY>‘,year); -- 把規則中<YYYY>替換成相應年 ReturnNum:=REPLACE( ReturnNum,‘<MM>‘,month); -- 把規則中<MM>替換成相應月 ReturnNum:=REPLACE( ReturnNum,‘<DD>‘,day); -- 把規則中<DD>替換成相應日 ReturnNum:=REPLACE( ReturnNum,WorkFLowStr,SeqNowNumStr);-- 把規則中的形如<XXX>的替換成相應流水號, /***********更新當前流水值為最大流水號、上一個流水號產生時間和運行標記(運行標記置為"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*******/exceptionwhen others thenrollback;MessageCode:=‘無此編號規則‘||MessageCode;end Proc_GetSeqence;-- SELECT * FROM RUL_Sequence
Oracle產生流水號