@j238267431

Почему в функции MYSQL при присвоении в переменную значения из таблицы не учитывается условие WHERE?

Добрый день

подскажите пожалуйста почему если в функции MYSQL делаю вот так

DROP FUNCTION IF EXISTS YourFunction;
DELIMITER $$
CREATE FUNCTION YourFunction (qty INT, orderid INT) RETURNS TEXT

BEGIN
DECLARE text_t TEXT;
SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = 871 LIMIT 1;
RETURN text_t;
END$$

DELIMITER ;


то условие WHERE не учитывается и берется просто первая строка из таблицы
Может процедуру надо использовать вместо?
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
@Uncleruc1
Проблема заключается в том, что в вашей функции условие WHERE \orderid` = 871жестко зафиксировано, и оно всегда будет брать строку с этимorderid, игнорируя переданное значение orderid` в параметр функции.

Чтобы учитывать переданное значение в параметр функции, необходимо использовать сам параметр orderid вместо фиксированного значения. Вот исправленный код функции:
DROP FUNCTION IF EXISTS YourFunction;
DELIMITER $$
CREATE FUNCTION YourFunction (qty INT, orderid INT) RETURNS TEXT

BEGIN
DECLARE text_t TEXT;
SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = orderid LIMIT 1;
RETURN text_t;
END$$

DELIMITER ;


Однако, в данном виде WHERE \orderid` = orderid` не сработает так, как вы ожидаете, потому что MySQL может спутать поле таблицы с параметром функции. Чтобы избежать этой путаницы, лучше использовать псевдонимы или уникальные имена для параметров. Например:
DROP FUNCTION IF EXISTS YourFunction;
DELIMITER $$
CREATE FUNCTION YourFunction (p_qty INT, p_orderid INT) RETURNS TEXT

BEGIN
DECLARE text_t TEXT;
SELECT `sum` INTO text_t FROM t_order_price_type WHERE `orderid` = p_orderid LIMIT 1;
RETURN text_t;
END$$

DELIMITER ;

Здесь параметр функции называется p_orderid, что предотвращает конфликт имен между полем таблицы и параметром функции.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы