не работает переменная функции mysql

0

Я пишу функцию, которая должна возвращать плавающее значение.

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);

дает правильный результат.

Как настроить вывод запроса на переменную?

Теги:

1 ответ

0

Практически неверно использовать имя переменной, которое может конфликтовать с именами столбцов. Кроме того, подзапрос кажется очень ненужным. Я бы попробовал нечто подобное:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню