Bot*_* FM 2 mysql sql stored-procedures
在MySql中
UPDATE `inventoryentry` SET `Status` = 1 WHERE `InventoryID`=92 AND `ItemID`=28;
Run Code Online (Sandbox Code Playgroud)
它只成功更新了一行,其中inventoryID = 92,itemID = 28,显示以下消息.
1 row(s) affected
Run Code Online (Sandbox Code Playgroud)
当我把它放在存储过程上时,如下所示
CREATE DEFINER=`root`@`localhost` PROCEDURE `Sample`(IN itemId INT, IN itemQnty
DOUBLE, IN invID INT)
BEGIN
DECLARE crntQnty DOUBLE;
DECLARE nwQnty DOUBLE;
SET crntQnty=(SELECT `QuantityOnHand` FROM `item` WHERE id=itemId);
SET nwQnty=itemQnty+crntQnty;
UPDATE `item` SET `QuantityOnHand`=nwQnty WHERE `Id`=itemId;
UPDATE `inventoryentry` SET `Status` = 1 WHERE `InventoryID`=invID AND
`ItemID`=itemId;
END$$
Run Code Online (Sandbox Code Playgroud)
调用存储过程
CALL Sample(28,10,92)
Run Code Online (Sandbox Code Playgroud)
它更新inventoryentry中的所有status = 1 而不是InventoryID(即92)忽略ItemID,而不是只更新一行.显示以下消息!
5 row(s) affected
Run Code Online (Sandbox Code Playgroud)
为什么存储过程忽略update语句中的itemID?或为什么存储过程更新多次?但没有存储过程它工作正常.
除了字段名称之外,您还需要使用不同的变量名称,还要使用带有列的表名称以便更好地理解,就像我在下面使用的那样:
CREATE DEFINER=`root`@`localhost` PROCEDURE `Sample`(IN itemID INT, IN itemQnty
DOUBLE, IN invID INT)
BEGIN
DECLARE crntQnty DOUBLE;
DECLARE nwQnty DOUBLE;
SET crntQnty=(SELECT `QuantityOnHand` FROM `item` WHERE id=itemID);
SET nwQnty=itemQnty+crntQnty;
UPDATE `item` SET `QuantityOnHand`=nwQnty WHERE `QuantityOnHand`.`Id`=itemID;
UPDATE `inventoryentry` SET `Status` = 1 WHERE `InventoryID`=invID AND
`inventoryentry`.`ItemID`=itemID;
END$$
Run Code Online (Sandbox Code Playgroud)