Mysql-Procedure3

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;
Contents
  1. 1. Mysql存储过程案例3
    1. 1.1. 使用Mysql存储过程将一个订单下的各个明细拆分
    2. 1.2. 以下为存储过程范例:
|