Расчеты в хранимых процедурах MySQL - PullRequest
0 голосов
/ 22 ноября 2018

Я создаю хранимую процедуру, которая при вводе класса для элемента дает вам общее значение.Из-за этого мне нужно добавить расчет к моему запросу в 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?Я попытался это сделать, и это все равно дало мне сообщение об ошибке.

1 Ответ

0 голосов
/ 22 ноября 2018

У вас есть несколько строк для itemClass = 'HW' в таблице hsitems.SELECT .. INTO документация конкретно гласит:

Запрос должен возвращать одну строку.Если запрос не возвращает строк, появляется предупреждение с кодом ошибки 1329 (Нет данных), а значения переменных остаются без изменений.Если запрос возвращает несколько строк, возникает ошибка 1172 (результат состоит из более чем одной строки).Если возможно, что оператор может извлечь несколько строк, вы можете использовать LIMIT 1, чтобы ограничить результирующий набор одной строкой.

Однако, исходя из имени вашей переменной, я чувствую, что вы пытаетесьвместо SUM(price*numinstock), чтобы получить общую стоимость.Это также обеспечит неявное агрегирование (GROUP BY) в одну строку.

Кроме того, если объявить OUT totalval INT, ваш вывод будет преобразован в int, и вы потеряете значения после десятичного числа.Поэтому я изменил его на OUT totalval DECIMAL(10,2).При работе с валютными числами предпочтительнее использовать DECIMAL вместо типов с плавающей запятой, таких как FLOAT и DOUBLE.

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().Также обратите внимание, что вывод будет теперь в формате String.

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 ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...