在MySql存储过程中更新多次

时间:2012-05-31 10:22:51

标签: mysql sql stored-procedures

在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?或为什么存储过程更新多次?但是没有存储过程它工作正常。

3 个答案:

答案 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 的回答。