3

在 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)

它根据InventoryID (即92)更新inventoryentry中的所有状态= 1,忽略ItemID,而不是只更新一行。显示以下消息!

5 row(s) affected 

为什么存储过程在更新语句中忽略 itemID?或者为什么存储过程更新不止一次?但是没有存储过程它工作正常。

4

3 回答 3

7

除了字段名称之外,您还需要使用不同的变量名称,还需要将表名称与列一起使用,以便更好地理解,如下所示:

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$$
于 2012-05-31T10:37:15.250 回答
2

因为

update inventoryentry ... WHERE ... AND `ItemID`=itemId

您是说该列itemid应与itemid始终相同的列true

尝试将参数重命名为与列名不同的名称

于 2012-05-31T10:27:41.193 回答
1

对列和变量名使用相同的名称有一些问题

在创建时不检查存储过程代码的语义。在运行时,会检测到未声明的变量,并为每次引用未声明的变量生成错误消息。然而,SP 似乎相信任何引用都表示一列,即使句法上下文排除了这一点。这会导致程序出现非常混乱的错误消息。

您的列名ItemID与输入变量名匹配itemId,因此是问题所在。

请在此处查看我对类似查询的回答。

于 2012-05-31T10:51:17.603 回答