码迷,mamicode.com
首页 > 数据库 > 详细

MySql生成流水号

时间:2015-05-05 16:20:23      阅读:359      评论:0      收藏:0      [点我收藏+]

标签:

基础规则表Rul_Sequence:

技术分享

 

规则表中的数据:

技术分享

 

辅助存储过程:

 

CREATE DEFINER=`root`@`%` PROCEDURE `proc_getseqence`(IN `SeqCode` VARCHAR(60), OUT `ReturnNum` VARCHAR(40), OUT `MessageCode` VARCHAR(800))
    COMMENT 获取序列号
BEGIN
declare SeqNowNumStr VARCHAR(20);
declare SeqNowNum INT;
declare Nowyear CHAR(4);
declare Nowmonth CHAR(2);
declare Nowday CHAR(2);
declare NowLength INT;
declare DataFormat VARCHAR(50);
declare IniValue INT;
declare ResetType VARCHAR(10);
declare LastDate    CHAR(8);
declare WorkFLowStr VARCHAR(20);
declare DataNow CHAR(8);
declare i INT;

    /* 初始化变量 */
     SET MessageCode=999;
     SET ReturnNum = 0;
     SET NowLength=0;
     SET SeqNowNum =0;
     SET DataNow=DATE_FORMAT(NOW(),%Y%m%d);
     SET Nowyear=SUBSTRING(DataNow,1,4);
     SET Nowmonth =SUBSTRING(DataNow,5,2);
     SET Nowday =SUBSTRING(DataNow,7,2);
     Set 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 (ResetType=2 and DataNow<>LastDate  AND IniValue>0) 
        OR (ResetType=3 and concat(nowyear,nowmonth)<>substr(LastDate,1,6) AND IniValue>0)
        OR (ResetType=4 and nowyear<>substr(LastDate,1,4) AND IniValue>0 ) then
           set SeqNowNum=IniValue;
 end if; 

set i=NowLength; -- i 此时表示流水号的总长度
set WorkFLowStr=<;
while NowLength>0 do     
         set WorkFLowStr=concat(WorkFLowStr,X);
        set NowLength=NowLength-1;
     end while;  
    set WorkFLowStr=concat(WorkFLowStr,>);
     /***********拼流水号格式 End*******/
    set SeqNowNumStr=concat(SeqNowNum,‘‘);
    set NowLength=i-length(SeqNowNumStr); 
     /***********补零操作 Start*******/           
     WHILE NowLength>0 do
         set SeqNowNumStr=concat(0,SeqNowNumStr);
         set NowLength=NowLength-1;
     end while;
     /***********补零操作 End*******/  

    set ReturnNum=REPLACE(DataFormat,<YYYY>,nowyear);            -- 把规则中<YYYY>替换成相应年
    set ReturnNum=REPLACE( ReturnNum,<MM>,nowmonth);                -- 把规则中<MM>替换成相应月
    set ReturnNum=REPLACE( ReturnNum,<DD>,nowday);                -- 把规则中<DD>替换成相应日
    set ReturnNum=REPLACE( ReturnNum,WorkFLowStr,SeqNowNumStr);-- 把规则中的形如<XXX>的替换成相应流水号,
     
     /***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) Start*******/

     UPDATE RUL_Sequence SET now_seqvalue=SeqNowNum+1,date_max=DataNow,is_running=1, edit_time=now()
     WHERE is_running=2 AND  seq_code=SeqCode;
     commit;
     /***********更新当前流水值为最大流水号、上一个流水号生成时间和运行标记(运行标记置为"1"(没有运行) ) End*******/

-- set MessageCode =concat(‘无此编号规则‘,MessageCode);
END

 

MySql生成流水号

标签:

原文地址:http://www.cnblogs.com/andequan/p/4478999.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!