在MySQL中使用过程向表中插入多个条目

在MySQL中使用过程向表中插入多个条目,mysql,stored-procedures,Mysql,Stored Procedures,我在mysql中创建了一个过程,插入到表中,如下所示 DELIMITER $$ CREATE PROCEDURE createOrderPR ( IN iv_productID INT, IN iv_orderDate DATE, IN iv_orderTime TIME, IN iv_shopID

我在mysql中创建了一个过程,插入到表中,如下所示

DELIMITER $$
CREATE PROCEDURE createOrderPR ( IN iv_productID INT,
                                 IN iv_orderDate DATE,
                                 IN iv_orderTime TIME,
                                 IN iv_shopID INT,
                                 IN iv_mobileNo varchar(10),
                                 IN iv_quantity smallint,
                                 IN iv_total float(10,2),
                                 IN iv_discount float(10,2),
                                 IN iv_taxable float(10,2),
                                 IN iv_CGST float(10,2),
                                 IN iv_SGST float(10,2)
                                 ) 
                               
 BEGIN
    DECLARE availQty smallint default 0;
    SELECT stockCount INTO availQty FROM product  WHERE productID = iv_productID; 
    SET availQty = availQty - iv_quantity;
    start transaction;
    set autocommit =0;
    INSERT INTO orders(orderNo,productID,orderDate,orderTime,shopID,mobileNo,quantity,total,discount,taxable,CGST,SGST,orderStatus,deletionMark)
    VALUES( null,iv_productID,iv_orderDate,iv_orderTime,iv_shopID,iv_mobileNo,iv_quantity,iv_total,iv_discount,iv_taxable,iv_CGST,iv_SGST,'Open',null); 
    
    UPDATE product SET stockCount = availQty WHERE productID = iv_productID;
    COMMIT;

    SELECT MAX(orderNo) FROM orders  WHERE shopID = shopID AND mobileNo = mobileNo; 
 END
$$

目前它只允许单个记录。现在我需要插入多个记录,在这种情况下,如何定义过程的in参数。请提出建议。

通过在参数中使用JSON解决了这个问题。这些是示例代码注意:表中添加了新列rest all no change

DELIMITER $$
CREATE PROCEDURE createOrderMulti ( IN orderJson JSON,
                                    IN length INT ) 
 BEGIN
    -- Date Declaration
    DECLARE availQty smallint default 0;
    DECLARE iv_productID INT;
    DECLARE iv_orderDate DATE;
    DECLARE iv_orderTime TIME;
    DECLARE iv_shopID INT;
    DECLARE iv_mobileNo varchar(10);
    DECLARE iv_quantity smallint;
    DECLARE iv_total float(10,2);
    DECLARE iv_discount float(10,2);
    DECLARE iv_taxable float(10,2);
    DECLARE iv_CGST float(10,2);
    DECLARE iv_SGST float(10,2);
    DECLARE counter smallint default 0;
    DECLARE item INT;
    DECLARE orderNo INT DEFAULT null;
    
    start transaction;
    set autocommit = 0;
    
    WHILE counter < length DO
    -- Extract the JSON value
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].productID')) INTO iv_productID;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].orderDate')) INTO iv_orderDate;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].orderTime')) INTO iv_orderTime;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].shopID')) INTO iv_shopID;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].mobileNo')) INTO iv_mobileNo;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].quantity')) INTO iv_quantity;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].total')) INTO iv_total;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].discount')) INTO iv_discount;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].taxable')) INTO iv_taxable;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].CGST')) INTO iv_CGST;
    SELECT JSON_VALUE(orderJson, CONCAT('$[', counter, '].SGST')) INTO iv_SGST;
    
    SELECT stockCount INTO availQty FROM product  WHERE productID = iv_productID; 
    SET availQty = availQty - iv_quantity;
    SET item = counter + 1;
    
    INSERT INTO orders(orderNo,item,productID,orderDate,orderTime,shopID,mobileNo,quantity,total,discount,taxable,CGST,SGST,orderStatus,deletionMark)
    VALUES( orderNo,item,iv_productID,iv_orderDate,iv_orderTime,iv_shopID,iv_mobileNo,iv_quantity,iv_total,iv_discount,iv_taxable,iv_CGST,iv_SGST,'Open',null); 
    
    SET orderNo = LAST_INSERT_ID();
    
    UPDATE product SET stockCount = availQty WHERE productID = iv_productID;
    
    SET counter = counter + 1;
    END WHILE;
    COMMIT;
    --SELECT MAX(orderNo) FROM orders  WHERE shopID = shopID AND mobileNo = mobileNo; 
    SELECT orderNo as orderNo;
 END
$$

为什么不多次调用存储过程Hi Slava,如果多次调用存储过程,并且一次调用由于某种原因失败,那么它将创建不一致的数据。例如,将参数数组作为JSON数组而不是标量参数传递,解析它们并插入多行-什么问题?PS。最好的方法是将数据数组存储到临时表中,并在一个查询中插入所有不能部分执行的行。为什么是varchar?JSON是MySQL支持的数据类型。