【问题标题】:In MySql Stored Procedure updating more than one time在 MySql 存储过程中更新不止一次
【发布时间】:2012-05-31 10:22:50
【问题描述】:

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

【问题讨论】:

  • 检查服务器上是否执行了最新的sp脚本。

标签: mysql sql stored-procedures


【解决方案1】:

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

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$$
【解决方案2】:

因为

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

您是说itemid 列应与itemid 列相同,后者始终为true

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

【讨论】:

    【解决方案3】:

    Using same names for columns and variable names has some issues

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

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

    请查看我对类似查询的回答here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 2011-10-15
      • 2013-08-30
      相关资源
      最近更新 更多