我正在制定一个销售我的物品的程序。当我尝试调用它时,它告诉我该错误消息。我检查了哪个部分返回了更多行,但我无法弄清楚。这是该过程的代码:
DELIMITER //
CREATE PROCEDURE SellItem(pCharacterName varchar(50), pItemName varchar(50), howManyItems int(11))
BEGIN
DECLARE pchar int(11);
DECLARE pitem int(11);
DECLARE pitemCost int(11);
DECLARE pcharMoney int(11);
DECLARE newMoneyValue int(11);
DECLARE cnt int(11) DEFAULT 1;
DECLARE pcharitid int(11);
SET pchar=(SELECT `getChar`(`pCharacterName`));
SET pitem=(SELECT `getItem`(`pItemName`));
SET pitemCost=(SELECT `price` FROM `item` WHERE `item`.`item_id`=pitem);
SET pcharMoney=(SELECT `money` FROM `character` WHERE `character`.`character_id`=pchar);
SET newMoneyValue=pcharMoney;
WHILE cnt<=`howManyItems` DO
SET newMoneyValue=newMoneyValue+pitemCost;
SET cnt=cnt+1;
END WHILE;
SET cnt=1;
WHILE cnt<=`howManyItems` DO
SET pcharitid=(SELECT MAX(`character_item_id`) FROM `character_item` WHERE `character_item`.`character_id`=pchar AND `character_item`.`item_id`=pitem);
IF (SELECT `item_id` FROM `character_item` WHERE `character_item`.`item_id` IN(SELECT `item_id` FROM `item` WHERE `item`.`name`=`pItemName`)) THEN
DELETE FROM `character_item` WHERE `character_item`.`character_item_id`=pcharitid;
UPDATE `character` SET `money`=newMoneyValue WHERE `character`.`character_id`=pchar;
SET cnt=cnt+1;
END IF;
END WHILE;
END; //
DELIMITER ;
我调用的函数是简单的函数,它们返回所选角色/项目的 ID。
当您在只需要一个值的上下文中调用 SELECT 时,如果逻辑上不能保证 SELECT 只返回一个值,则会出现此错误。
您有六个 SELECT 操作:
SET pchar=(SELECT `getChar`(`pCharacterName`));
SET pitem=(SELECT `getItem`(`pItemName`));
这两个正在调用一个标量参数上的存储函数。它们没问题,因为在这两种情况下,它只能返回一个值。
SET pitemCost=(SELECT `price` FROM `item` WHERE `item`.`item_id`=pitem);
这个 SELECT 可能没问题。我假设item.item_id
是该表的主键,因此它只能匹配一行(或零行)。
SET pcharMoney=(SELECT `money` FROM `character` WHERE `character`.`character_id`=pchar);
同样,这似乎没问题,假设character.character_id
是主键。
SET pcharitid=(SELECT MAX(`character_item_id`) FROM `character_item` WHERE `character_item`.`character_id`=pchar AND `character_item`.`item_id`=pitem);
这肯定只返回一个值,因为您正在使用MAX()
并且查询没有GROUP BY
.
IF (SELECT `item_id` FROM `character_item` WHERE `character_item`.`item_id` IN
(SELECT `item_id` FROM `item` WHERE `item`.`name`=`pItemName`)) THEN
内部子查询不需要是标量,因为它是IN()
谓词的一部分,可以与多个值进行比较。
外部查询必须是标量查询,但它不是。可以匹配多行,具体取决于您的数据,因此不能在逻辑上用于IF()
条件。
您可以使用 my usingSELECT MAX(item_id)...
或...LIMIT 1
在查询结束时使用来修复它。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句