我正在创建一个存储过程,当您输入某个项目的类时,它会为您提供总值(value)。因此,我必须向 SP 内的查询添加计算。我不断收到一条错误消息,内容如下:#1172 - 结果包含多行。我的猜测是,这是因为它从两个地方拉来获取产品。这是我的 SP 代码:
DELIMITER //
CREATE PROCEDURE totalValue (IN whichClass varchar(5),
OUT totalval int)
BEGIN
SELECT (price * numInStock) into totalval
FROM hsitems
WHERE itemClass = whichClass;
END //
DELIMITER ;
现在,当我输入任何内容并调用该过程时,我收到错误消息。这是我尝试调用的方式:
CALL totalValue('HW',@totalval);
SELECT @totalval;
在将计算放入totalval之前,我是否需要将其定义为某种东西?我尝试这样做,但它仍然给我一条错误消息。
最佳答案
在 hsitems
表中,itemClass = 'HW'
基本上有多行。 SELECT .. INTO
文档特别指出:
The query should return a single row. If the query returns no rows, a warning with error code 1329 occurs (No data), and the variable values remain unchanged. If the query returns multiple rows, error 1172 occurs (Result consisted of more than one row). If it is possible that the statement may retrieve multiple rows, you can use LIMIT 1 to limit the result set to a single row.
但是,根据您的变量名称,我觉得您正在尝试 SUM(price*numinstock)
来获取总值(value)。这也将确保隐式聚合(GROUP BY
)到单行中。
此外,通过声明 OUT Totalval INT
,您的输出将转换为 int,并且您将丢失小数点后的值。所以我将其更改为OUT Totalval DECIMAL(10,2)
。处理货币数字时,最好使用 DECIMAL
而不是 FLOAT
和 DOUBLE
等浮点类型。
DELIMITER //
CREATE PROCEDURE totalValue (IN whichClass varchar(5),
OUT totalval DECIMAL(10,2))
BEGIN
SELECT SUM(price * numInStock) into totalval -- changed to SUM()
FROM hsitems
WHERE itemClass = whichClass;
END //
DELIMITER ;
如果您想将总和值格式化为小数点后两位(如货币),我们可以使用 Format()
功能。另请注意,现在输出将为字符串格式。
DELIMITER //
CREATE PROCEDURE totalValue (IN whichClass varchar(5),
OUT totalval VARCHAR(32))
BEGIN
SELECT FORMAT(SUM(price * numInStock), 2) into totalval
FROM hsitems
WHERE itemClass = whichClass;
END //
DELIMITER ;
关于mysql - MySQL 存储过程中的计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53422904/