mysql - MySQL 存储过程中的计算

标签 mysql stored-procedures

我正在创建一个存储过程,当您输入某个项目的类时,它会为您提供总值(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 而不是 FLOATDOUBLE 等浮点类型。

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/

相关文章:

mysql - SQL - 获取ID的最新记录并保留空列

通过 ODBC 从 SSRS 调用 MySQL 存储过程

stored-procedures - 网络矩阵和存储过程

mysql - 更多奇怪的 MySQL 行为 - 查询优化帮助

mysql - 根据id按时间顺序连接两个表

php - 在本地计算机上使用 phpMyAdmin 上传 MySQL 数据库时出现问题

php - 如何在 Cakephp 中按行 ID 从箭头检索特定行

c# - 使用 C# 执行 Oracle Procedure 时出现错误 ORA-01036

c# - 将 DataTable 作为参数发送到存储过程

mysql - 过程中的 SQL 1064