Mysql存储过程案例3
使用Mysql存储过程将一个订单下的各个明细拆分
使用循环将一个订单中的各个产品拆分成单独的产品编号,比如一个订单下有N个产品,N个产品又有N个数量,即将每一个产品都编号。
以下为存储过程范例:
DROP PROCEDURE SplitProduct;
CREATE PROCEDURE SplitProduct(
IN OrderCode VARCHAR(255),
IN ProjectCode VARCHAR(255),
IN ProductCode VARCHAR(255),
OUT PReturn INT
)
/*
OrderCode : 委托单号
ProjectCode : 项目令号
ProductCode : 材料ID
*/
BEGIN
-- 委托单对应的材料信息,为材料样品表:SKT9
-- 材料的数量 SKF150
DECLARE ProductQuantity INT;
-- 委托单子子表,为要拆分的材料样品信息表:SKT23
-- 样品名称 SKF396
DECLARE SampleName VARCHAR(255);
-- 样品类型 SKF398
DECLARE SampleType VARCHAR(255);
-- 用于储存当前日期最大流水号
DECLARE MaxRunNumber INT;
-- 用于存储循环的最大值
DECLARE WhileMaxNumber INT;
-- 判断流水号是否存在
DECLARE IsLife INT;
-- 设置默认返回值
SET PReturn = 0;
-- 获取产品的名称,样品类型
SELECT SKF138, skf285, IFNULL(SKF150,0) INTO SampleName, SampleType, ProductQuantity FROM SKT9
WHERE SKF137 = ProductCode AND SKF362 = OrderCode AND SKF363 = ProjectCode;
-- 判断流水号是否存在
SELECT COUNT(SKF395) INTO IsLife FROM SKT23 WHERE substr(SKF395, 6, 10) = CURDATE();
-- 获取当前日期下的可用最大流水号
IF IsLife != 0 THEN
SELECT MAX(RIGHT(IFNULL(SKF395, '0000'),4)) + 1 INTO MaxRunNumber FROM SKT23
WHERE substr(IFNULL(SKF395,CONCAT('Y-YP-', CURDATE())), 6, 10) = CURDATE();
SET WhileMaxNumber = MaxRunNumber + ProductQuantity - 1;
ELSE
SET MaxRunNumber = 1;
SET WhileMaxNumber = ProductQuantity;
END IF;
-- 判断数量是否大于零,若小于等于0不做操作
IF ProductQuantity > 0 THEN
-- 开启拆分事务
START TRANSACTION;
WHILE MaxRunNumber <= WhileMaxNumber DO
INSERT INTO SKT23 (SKF395, SKF396, SKF398, SKF399, SKF400, SKF401, SKF427) VALUE
(CONCAT('Y-YP-', CURDATE(), '-', RIGHT(CONCAT('0000', MaxRunNumber), 4)),
SampleName, SampleType, CONCAT('Y-YP-', CURDATE(), '-', RIGHT(CONCAT('0000', MaxRunNumber), 4)),
OrderCode, ProjectCode, ProductCode);
SET MaxRunNumber = MaxRunNumber +1;
END WHILE;
-- 设置返回值
SET PReturn = 1;
COMMIT;
END IF;
END;