在MySql中
UPDATE `inventoryentry` SET `Status` = 1 WHERE `InventoryID`=92 AND `ItemID`=28;
它只成功更新了一行,其中inventoryID = 92,itemID = 28,显示以下信息。
1 row(s) affected
当我把它放在存储过程上时,如下所示
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$$
调用存储过程
CALL Sample(28,10,92)
它会将 inventoryentry 中的所有状态= 1更新为 InventoryID (即92)忽略ItemID,而不是仅更新一行。显示以下消息!
5 row(s) affected
为什么存储过程忽略update语句中的itemID?或为什么存储过程更新多次?但是没有存储过程它工作正常。
答案 0 :(得分:6)
除了字段名称之外,您还需要使用不同的变量名称,还要使用表格列和列,以便更好地理解,如下所示:
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$$
答案 1 :(得分:2)
因为
update inventoryentry ... WHERE ... AND `ItemID`=itemId
您说专栏itemid
应与专栏itemid
相同,而true
尝试将参数重命名为与列名不同的名称
答案 2 :(得分:1)
Using same names for columns and variable names has some issues 的。
在CREATE时不检查存储过程代码的语义。在运行时,检测到未声明的变量,并为每个对未声明变量的引用生成错误消息。然而,SP似乎相信任何引用都表示一个列,即使句法上下文排除了这一点。如果是程序,这会导致非常混乱的错误消息。
您的列名ItemID
与输入变量名称itemId
匹配,因此是个问题。
请查看我对类似查询 here 的回答。