Mysql 存储过程实现订单流水号

存储过程实现流水号

  • 存储过程
实现效果:SHHP201806080002
前缀编码--prefixStr 'SHHP'
后缀编码长度-- suffixCodeLength 长度4 (0002)
日期字符-- 20180608

先准备一张表 express_code 
需要一个字段 product_code

CREATE PROCEDURE `generate_code`(IN prefixStr varchar(10), IN suffixCodeLength int(10), OUT newCode varchar(50))
BEGIN
	DECLARE currentDate VARCHAR(14); 
	-- 当前日期字符串
	DECLARE suffixCode INT DEFAULT 0;
	-- 后缀编码
	DECLARE oldCode VARCHAR(30) DEFAULT '';
    -- 上一个编码
	SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;
    -- 格式化日期,如'20180608'
	SELECT IFNULL(product_code, '') INTO oldCode
		FROM express_info    
	WHERE SUBSTRING(product_code, 1, LENGTH(currentDate) + LENGTH(prefixStr)) = CONCAT(prefixStr,currentDate)   
		AND LENGTH(product_code) =  LENGTH(prefixStr) + LENGTH(currentDate) + suffixCodeLength
		ORDER BY product_code DESC LIMIT 1 ; 
    -- 查询上一个code
	IF oldCode != '' 
	THEN     
		SET suffixCode = CONVERT(SUBSTRING(oldCode, -suffixCodeLength), DECIMAL) ;  
	END IF ; 
    -- 后缀编码转换为数字,如果前面有0005,则去除前面的0
	SELECT CONCAT(prefixStr, currentDate,  LPAD((suffixCode + 1), suffixCodeLength, '0')) INTO newCode ;
    -- 后缀编码加1,并进行拼接
	SELECT newCode ; 

END
复制代码
  • mybatis、后端调用
      只有一个输出参数时:
    
    <select id="getExpressCode" resultType="string"  statementType="CALLABLE">
    
      call generate_productCode(?)
    
    </select>
  
    // mapper 接口
    String getExpressCode();
    // service 
    public String getExpressCode() {
    	
    	String expressCode = expressInfoMapper.getExpressCode();
    	return expressCode;
    }

     带输入、输出参数时
    
    // 参数封装到实体类
    @Data
    public class CodeRule {
    	private String prefixString;
    	private String code;
    	private int suffixCodeLength;
    }

    <select id="getExpressCode" resultType="string" parameterType="com.peng.express.entity.CodeRule"  statementType="CALLABLE">
    
      call generate_code(
          #{prefixString,mode=IN,jdbcType=VARCHAR},
          #{suffixCodeLength,mode=IN,jdbcType=INTEGER},
          #{code,mode=OUT,jdbcType=VARCHAR}
          )
    </select>	
    
    String getExpressCode(CodeRule codeRule);
    
    public String getExpressCode() {
    	CodeRule codeRule = new CodeRule();
    	codeRule.setPrefixString("XSBH");
    	codeRule.setSuffixCodeLength(4);
    	// 查询结束后,结果自动回填到codeRule的code属性
    	String expressCode = expressInfoMapper.getExpressCode(codeRule);
    	return expressCode;
    }
    
复制代码
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值