MySql 存储过程 - 错误 1172 (42000):结果由多行组成
MySql Stored Procedure - ERROR 1172 (42000): Result consisted of more than one row
我编写了一个存储过程来根据数据库中可用的一些折扣方案计算净产品金额....存储过程编译成功但在 运行 时我得到 错误 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
请帮助我...提前谢谢你..
您必须确保,只需要一行的查询,只需 return 一行。
例如,您的查询使用into
句:
SELECT `SellingUnitPrice` into netItemAmount
FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId;
查询将 return 多行的原因有很多(数据不一致、重复记录...任何原因)
一个建议(但不推荐)的解决方案是在句子末尾添加 limit 1
。
SELECT `SellingUnitPrice` into netItemAmount
FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId
LIMIT 1;
我编写了一个存储过程来根据数据库中可用的一些折扣方案计算净产品金额....存储过程编译成功但在 运行 时我得到 错误 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
请帮助我...提前谢谢你..
您必须确保,只需要一行的查询,只需 return 一行。
例如,您的查询使用into
句:
SELECT `SellingUnitPrice` into netItemAmount
FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId;
查询将 return 多行的原因有很多(数据不一致、重复记录...任何原因)
一个建议(但不推荐)的解决方案是在句子末尾添加 limit 1
。
SELECT `SellingUnitPrice` into netItemAmount
FROM `TBL_PRODUCT_MASTER` WHERE `Id` = productId
LIMIT 1;