利用mysql存储过程实现唯一单号生成规则

SET @orderNo = '';  
CALL `new_generate_orderNo`('D0001', 6, @orderNo);  
SELECT @orderNo;

首先我们新建一张单号生成规则表,表结构如下:

CREATE TABLE `bas_seq` (
  `bas_seq_id` varchar(50) NOT NULL DEFAULT 'id',
  `del_flag` char(4) DEFAULT NULL COMMENT '状态',
  `bas_seq_code` char(5) DEFAULT NULL COMMENT '编号',
  `bas_seq_name` varchar(20) DEFAULT NULL COMMENT '名称',
  `initial_value` int(6) DEFAULT NULL COMMENT '初始值',
  `max_value` int(6) DEFAULT NULL COMMENT '最大值',
  `growth` int(6) DEFAULT NULL COMMENT '增长值',
  `current_value` int(6) DEFAULT NULL COMMENT '当前值',
  `seq_pre` varchar(20) DEFAULT NULL COMMENT '单号规则',
  `description` varchar(500) DEFAULT NULL COMMENT '描述',
  `insert_time` datetime DEFAULT NULL,
  PRIMARY KEY (`bas_seq_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后建立如下存储过程如下:

CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_orderNo`(in  basSeqCode char(5), in num int, out newOrderNo varchar(25))
label:BEGIN  

  DECLARE maxNo  INT  DEFAULT 999999 ;  -- 最大值
  DECLARE growthValue  INT DEFAULT 1   ;  -- 增长值
  DECLARE currentValue  INT DEFAULT -1   ;  -- 当前值
  DECLARE nextValue  INT DEFAULT 1   ;  -- 增长后的值
  DECLARE currentDate VARCHAR (15) ;     -- 当前日期,有可能包含时分秒 
  DECLARE orderNamePre VARCHAR (15) DEFAULT '';-- 前缀  
  #if num = 8 then    -- 根据年月日生成订单编号   
    SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;  -- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002   

     

#取变量赋值
     SELECT
     growth,current_value,max_value,seq_pre
     INTO growthValue,currentValue,maxNo,orderNamePre
     FROM bas_seq 
     WHERE bas_seq_code = basSeqCode;

#当前值与-1比较如果为-1则表示查询不到结果 提前退出
     IF currentValue = -1 THEN
      SET  newOrderNo = '';
     SELECT newOrderNo;
     LEAVE  label;   -- 如果查询不到结果则提前退出 
     END IF;       

#当前值与最大值比较,设置下一个值
     IF  currentValue < maxNo THEN
     SET nextValue = currentValue + 1;
     ELSE 
     SET nextValue = 1;
     END IF;


#字符串拼接
   SELECT   
    CONCAT(orderNamePre, currentDate,  LPAD(currentValue, num,'0')) INTO newOrderNo ;
   
#更新数据字典值
    UPDATE bas_seq SET current_value = nextValue WHERE bas_seq_code = basSeqCode;

#返回数据
      SELECT newOrderNo;
END

插入一条如下单号生成数据:

 调用存储过程和结果如下:

利用mysql存储过程实现唯一单号生成规则_第1张图片再次调用结果自动加一

利用mysql存储过程实现唯一单号生成规则_第2张图片

至此,整个存储过程调用结束,如有疑问或BUG欢迎提出! 

你可能感兴趣的:(mysql,java)