Хранимая процедура MySql - ОШИБКА 1172 (42000): результат состоит из более чем одной строки - PullRequest
0 голосов
/ 09 мая 2018

Я написал одну хранимую процедуру для расчета чистой суммы продукта на основе некоторых схем скидок, доступных в базе данных .... Хранимая процедура скомпилирована успешно, но во время выполнения я получаю ОШИБКА 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

Пожалуйста, помогите мне ... Спасибо заранее ..

1 Ответ

0 голосов
/ 10 мая 2018

Вы должны убедиться, что запросы, которым нужна только одна строка, просто возвращают одну строку.

Например, ваш запрос использует 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;  
...