需求:
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
运行效果