Я пишу функцию, которая должна возвращать плавающее значение.
BEGIN
DECLARE due_amount DECIMAL(9,2);
SET due_amount = (SELECT due_amount FROM (
SELECT id, MAX(date), due_amount, user_id
FROM lunch_transaction
GROUP BY user_id
HAVING user_id = user) l);
IF due_amount IS NULL THEN
SET due_amount = 0.00;
END IF;
RETURN due_amount;
END
Функция возвращает значение 0.00
даже при том, что значение должно быть чем-то другим.
Выполнение только этого запроса:
(SELECT due_amount FROM (
SELECT id, MAX(date), due_amount, user_id
FROM lunch_transaction
GROUP BY user_id
HAVING user_id = user) l);
дает правильный результат.
Как настроить вывод запроса на переменную?
Практически неверно использовать имя переменной, которое может конфликтовать с именами столбцов. Кроме того, подзапрос кажется очень ненужным. Я бы попробовал нечто подобное:
BEGIN
DECLARE v_due_amount DECIMAL(9,2);
SELECT v_due_amount := l.due_amount
FROM lunch_transaction l
WHERE l.user_id = in_user; -- I'm guessing 'user' is also a parameter
IF v_due_amount IS NULL THEN
SET v_due_amount = 0.00;
END IF;
RETURN v_due_amount;
END;
Ваша версия имеет функцию агрегации в подзапросе. Это не имеет смысла, потому что due_amount
не является аргументом функции агрегации. Эта логика должна быть:
SELECT v_due_amount := SUM(l.due_amount)
FROM lunch_transaction l
WHERE l.user_id = in_user; -- I'm guessing 'user' is also a variable