【问题标题】:MySql Stored Procedure - ERROR 1172 (42000): Result consisted of more than one rowMySql 存储过程 - 错误 1172 (42000):结果包含多于一行
【发布时间】:2018-05-09 18:14:28
【问题描述】:

我已经编写了一个存储过程来根据数据库中可用的一些折扣方案计算净产品金额.... 存储过程编译成功但在运行时我得到 ERROR 1172 (42000): 结果由多行组成

我的代码如下,

    delimiter //
    CREATE PROCEDURE calculateNetItemAmount(IN productId INT,IN quantity INT, OUT netItemAmount DOUBLE)
    BEGIN
        DECLARE discountPer DOUBLE DEFAULT 0;

        SELECT `SellingUnitPrice` into netItemAmount 
        FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId;
        SET netItemAmount = quantity * netItemAmount ;

        SELECT discDetail.`DiscountPercentage` into discountPer 
        FROM `TBL_DISCOUNT_DETAIL` AS discDetail , `TBL_DISCOUNT` AS disc, TBL_PRODUCT_DISCOUNT AS prodDisc 
        WHERE disc.`DiscountStartDate` < NOW() 
        AND disc.`DiscountEndDate` > NOW() AND disc.`IsEnabled` = 1 
        AND disc.`SchemeType` = 'Quantity Discount' 
        AND discDetail.DiscountId = disc.Id AND prodDisc.productId = productId 
        AND prodDisc.`IsEnabled` = 1 ;

        IF discountPer IS NOT NULL THEN 
           SET netItemAmount = netItemAmount * (1 - discountPer * 0.01)        
       END IF;

        SELECT discDetail.`DiscountPercentage` into discountPer 
        FROM `TBL_DISCOUNT_DETAIL` AS discDetail , `TBL_DISCOUNT` AS disc, TBL_PRODUCT_DISCOUNT AS prodDisc 
        WHERE disc.`DiscountStartDate` < NOW() AND disc.`DiscountEndDate` > NOW() 
        AND disc.`IsEnabled` = 1 AND disc.`SchemeType` = 'Volume Discount' 
        AND discDetail.DiscountId = disc.Id AND prodDisc.productId = productId 
        AND prodDisc.`IsEnabled` = 1 ;

        IF discountPer IS NOT NULL THEN 
           SET netItemAmount = netItemAmount * (1 - discountPer * 0.01)
        END IF;

    END//
    delimiter ;

输出:

mysql> CALL calculateNetItemAmount(1, 2, @RES);
ERROR 1172 (42000): Result consisted of more than one row

请帮助我...提前谢谢您..

【问题讨论】:

  • 使用SELECT ... INTO variable时,查询只能匹配一行。您的一个查询返回了不止一行。
  • SET netItemAmount = netItemAmount (1 - discountPer 0.01); 应该是什么意思?里面是否缺少*
  • 实际上是.... SET netItemAmount = netItemAmount (1 - discountPer * 0.01);
  • 你的意思是SET netItemAmount = netItemAmount * (1 - discountPer * 0.01)
  • 将代码放入 cmets 时使用反引号。编辑问题以显示正确的公式。

标签: mysql stored-procedures database-cursor


【解决方案1】:

你必须确保,只需要一行的查询,只返回一行。

例如,您的查询使用into 句:

    SELECT `SellingUnitPrice` into netItemAmount 
    FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId;

查询返回多于一行的原因有很多(数据不一致、重复记录……任何原因)

一种建议(但不建议)的解决方案是将limit 1 添加到句尾。

    SELECT `SellingUnitPrice` into netItemAmount 
    FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId
    LIMIT 1;  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多