Mysql 利用存储过程 实现单据号码(单号)生成器(万能版)

需求:

1.在项目开发过程中有一些业务单据我们希望有一个单号,如采购单、请假单等等。

2.由于上述每个业务单据都在不同的表里,并且由于项目开发不规范(字段命名不统一,有的把单号叫做Code,有的叫做Number),还有我们希望在销售单单号生成的是SA+日期+流水号,发货单又是S0+日期+流水号。

要求:

       写一个通用方法(存储过程)以适应上述要求

Mysql思路

1.要实现这种情况一定要使用预处理指令

2.使用预处理指令  一定只能用存储过程,而不能用自定义函数(它不支持预处理指令)

3.输入内容为 :表名、字段、头部标识

代码

CREATE DEFINER=`root`@`%` PROCEDURE `GetOrderNum`(Table_name VARCHAR(20),Filed_name VARCHAR(20),orderNamePre varchar(10))
BEGIN
	DECLARE currentDate VARCHAR (15) ;  -- 日期
	DECLARE maxNo INT DEFAULT 0 ; -- 最大单号
	DECLARE num INT DEFAULT 8 ; 
	
	DECLARE padstrlength int DEFAULT 3; -- 长度
	declare prelength INT ; -- 头部标识
	SET prelength = LENGTH(orderNamePre);

	
	SELECT DATE_FORMAT(NOW(), '%Y%m%d') INTO currentDate ;
	
	
	-- 预处理指令的使用
	-- 使用max优化
	set @optsql = CONCAT('SELECT IFNULL(MAX(RIGHT(',filed_name,',',padstrlength,' )), \'0\' ) into @maxNo',
                                            ' from ', table_name,
                                            ' WHERE' ,
                                            ' SUBSTRING(',filed_name,',', prelength  +  1,',',num,') = \'',currentDate,'\'',
                                            ' AND SUBSTRING(',filed_name,',1',',',prelength,') = \'',orderNamePre,'\''
                                            );
																						
	prepare stmt from @optsql;
																			
	execute stmt;
	deallocate prepare stmt;
	
	set maxNo = @maxNo;
	
	SELECT CONCAT(orderNamePre,currentDate,LPAD((maxNo + 1),padstrlength,'0')) as neworderno;

END

运行效果

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值