Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql存储过程-错误1172(42000):结果由多行组成_Mysql_Stored Procedures_Database Cursor - Fatal编程技术网

MySql存储过程-错误1172(42000):结果由多行组成

MySql存储过程-错误1172(42000):结果由多行组成,mysql,stored-procedures,database-cursor,Mysql,Stored Procedures,Database Cursor,我已经编写了一个存储过程,根据数据库中提供的一些折扣方案来计算净产品金额。。。。存储过程编译成功,但在运行时我得到了错误1172(42000):结果由多行组成 我的代码如下所示 delimiter // CREATE PROCEDURE calculateNetItemAmount(IN productId INT,IN quantity INT, OUT netItemAmount DOUBLE) BEGIN DECLARE discountPer DO

我已经编写了一个存储过程,根据数据库中提供的一些折扣方案来计算净产品金额。。。。存储过程编译成功,但在运行时我得到了错误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 ;

请帮助我…提前谢谢..

您必须确保,只需要一行的查询,只需返回一行即可

例如,您的查询在语句中使用了

    SELECT `SellingUnitPrice` into netItemAmount 
    FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId;
查询返回多行的原因很多(数据不一致、重复记录……任何原因)

一个建议(但不建议)解决方案是在句末添加
限制1

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

当您使用
时,请选择。。。对于变量
,查询只能匹配一行。您的一个查询返回了多行。What is
SET-netItemAmount=netItemAmount(1-折扣每0.01)应该是什么意思?里面有没有丢失的
*
?实际上是。。。。设置netItemAmount=netItemAmount(1-折扣率*0.01);你的意思是
设置netItemAmount=netItemAmount*(1-折扣率*0.01)
?在注释中添加代码时使用反勾号。编辑问题以显示正确的公式。
    SELECT `SellingUnitPrice` into netItemAmount 
    FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId
    LIMIT 1;