У вас есть несколько строк для 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 ;