3

MySqlで

UPDATE `inventoryentry` SET `Status` = 1 WHERE `InventoryID`=92 AND `ItemID`=28;

これは、inventoryID=92およびitemID=28の1つの行のみを正常に更新し、次のメッセージが表示されます。

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)

1行だけを更新するのではなく、ItemIDを無視してInventoryID (つまり、92)に対してinventoryentryのすべてのステータス=1を更新します。次のメッセージが表示されます!

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列と同じでなければならないと言っていますitemidtrue

パラメータの名前を列名とは異なる名前に変更してみてください

于 2012-05-31T10:27:41.193 に答える
1

列と変数名に同じ名前を使用すると、いくつかの問題が発生します

ストアドプロシージャコードのセマンティクスは、CREATE時にチェックされません。実行時に、宣言されていない変数が検出され、宣言されていない変数への参照ごとにエラーメッセージが生成されます。ただし、構文コンテキストで列が除外されている場合でも、SPは参照が列を示していると信じているようです。これにより、手順の場合に非常に紛らわしいエラーメッセージが表示されます。

列名ItemIDが入力変数名と一致するitemIdため、問題が発生します。

ここで同様の質問に対する私の答えを見てください。

于 2012-05-31T10:51:17.603 に答える