需求:
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))
BEGINDECLARE 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
运行效果
![](https://img.php1.cn/3cd4a/1eebe/cd5/2fdc212433a29829.png)
![](https://img.php1.cn/3cd4a/1eebe/cd5/e3aa5425383ba10d.png)
![](https://img.php1.cn/3cd4a/1eebe/cd5/4283cd4bbba41b87.png)