当前位置:Gxlcms > 数据库问题 > mysql 生成流水号 存储过程 订单编号

mysql 生成流水号 存储过程 订单编号

时间:2021-07-01 10:21:17 帮助过:3人阅读

CREATE TABLE `test_orders` ( 2 `id` int(11) NOT NULL AUTO_INCREMENT, 3 `orderNo` varchar(25) NOT NULL DEFAULT ‘‘, 4 `orderName` char(10) NOT NULL DEFAULT ‘‘, 5 PRIMARY KEY (`id`) 6 ) ENGINE=InnoDB AUTO_INCREMENT=76 DEFAULT CHARSET=utf8


生成订单编号的存储过程(generate_orderNo):

 1     CREATE DEFINER=PROCEDURE `generate_orderNo`(in orderNamePre char(2), in num int, out newOrderNo varchar(25))    
 2     BEGIN    
 3       DECLARE currentDate varCHAR (15) ;-- 当前日期,有可能包含时分秒     
 4       DECLARE maxNo INT DEFAULT 0 ; -- 离现在最近的满足条件的订单编号的流水号最后5位,如:SH2013011000002的maxNo=2     
 5         --  DECLARE l_orderNo varCHAR (25) ;-- 新生成的订单编号     
 6         --  DECLARE oldDate DATE ;-- 离现在最近的满足条件的订单编号的日期     
 7       DECLARE oldOrderNo VARCHAR (25) DEFAULT ‘‘ ;-- 离现在最近的满足条件的订单编号     
 8           
 9       if num = 8 then -- 根据年月日生成订单编号     
10         SELECT DATE_FORMAT(NOW(), %Y%m%d) INTO currentDate ;-- 订单编号形式:前缀+年月日+流水号,如:SH2013011000002     
11       elseif num = 14 then -- 根据年月日时分秒生成订单编号     
12         SELECT DATE_FORMAT(NOW(), %Y%m%d%H%i%s) INTO currentDate ; -- 订单编号形式:前缀+年月日时分秒+流水号,如:SH2013011010050700001,个人不推荐使用这种方法生成流水号     
13       else -- 根据年月日时分生成订单编号     
14         SELECT DATE_FORMAT(NOW(), %Y%m%d%H%i) INTO currentDate ;-- 订单形式:前缀+年月日时分+流水号,如:SH20130110100900005     
15       end if ;    
16          
17         SELECT IFNULL(orderNo, ‘‘) INTO oldOrderNo     
18           FROM test_orders     
19           WHERE SUBSTRING(orderNo, 3, num) = currentDate     
20             AND SUBSTRING(orderNo, 1, 2) = orderNamePre     
21             and length(orderNo) = 7 + num    
22           ORDER BY id DESC LIMIT 1 ; -- 有多条时只显示离现在最近的一条     
23               
24           IF oldOrderNo != ‘‘ THEN     
25             SET maxNo = CONVERT(SUBSTRING(oldOrderNo, -5), DECIMAL) ;-- SUBSTRING(oldOrderNo, -5):订单编号如果不为‘‘截取订单的最后5位     
26           END IF ;    
27           SELECT     
28             CONCAT(orderNamePre, currentDate,  LPAD((maxNo + 1), 5, 0)) INTO newOrderNo ; -- LPAD((maxNo + 1), 5, 0):如果不足5位,将用0填充左边     
29               
30           INSERT INTO test_orders (orderNo, orderName) VALUES (newOrderNo, testNo) ; -- 向订单表中插入数据     
31         --    set newOrderNo = l_orderNo;     
32           SELECT     
33             newOrderNo ;    
34     END  


参数说明:
    orderNamePre:(输入)订单编号的前缀,这里设定为两个字符
    num:(输入)将按什么规则生成流水号(生成规则有:年月日、年月日时分秒、年月日时分三种),可选的num有:8、12、14
    newOrderNo:(输出)新生成的订单编号

调用存储过程向表中插入数据:
    SET @orderNo = ‘‘;    
    CALL `generate_orderNo`(‘SH‘, 12, @orderNo);    
    SELECT @orderNo;  

查看生成的数据:
        技术分享

在实际项目中只需要修改其中的一些生成规则即可,到此为止,流水号的生成就搞定了

有关mysql存储过程的知识可以参考:MySQL存储过程详解

mysql 生成流水号 存储过程 订单编号

标签:

人气教程排行