Как установить тип данных varchar в функции? - PullRequest
0 голосов
/ 26 марта 2020

У меня есть проблема в моем коде, где я взял это: (ApliEMAIL int) в приведенном ниже коде, но когда я выполняю функцию, он возвращает пустые значения, потому что в таблице я принял электронную почту, поданную как varchar.

Когда я написать код с этим (ApliEMAIL varchar), он не создает функцию и выдает ошибку.

DELIMITER $$

#DROP FUNCTION IF EXISTS `get_appli_name`$$

CREATE FUNCTION get_appli_name_by_email(ApliEMAIL int) 
RETURNS VARCHAR(255)
BEGIN
DECLARE A_NAME VARCHAR(255) DEFAULT"";

  SELECT apli_fname  INTO   A_NAME
  FROM   tbl_signup
  WHERE  apli_email = ApliEMAIL;

  RETURN A_NAME;

END$$

DELIMITER ;


DELIMITER $$

#DROP FUNCTION IF EXISTS `get_appli_name`$$

CREATE FUNCTION get_appli_name_by_email(ApliEMAIL varchar) 
RETURNS VARCHAR(255)
BEGIN
DECLARE A_NAME VARCHAR(255) DEFAULT"";

  SELECT apli_fname  INTO   A_NAME
  FROM   tbl_signup
  WHERE  apli_email = ApliEMAIL;

  RETURN A_NAME;

END$$

DELIMITER ;

Ответы [ 3 ]

0 голосов
/ 26 марта 2020

Вам не хватает длины ApliEMAIL -параметра.

Введено:

CREATE FUNCTION get_appli_name_by_email(ApliEMAIL varchar) 

у вас должно быть:

CREATE FUNCTION get_appli_name_by_email(ApliEMAIL varchar(255)) 

.. или независимо от длины ApliEMAIL.

0 голосов
/ 26 марта 2020

Вы должны добавить детерминированный c или читает sql флаг данных.

DELIMITER $$
CREATE FUNCTION get_appli_name_by_email(ApliEMAIL varchar(50)) 
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
  RETURN ifnull((SELECT apli_fname FROM tbl_signup WHERE  apli_email = ApliEMAIL LIMIT 1), '');
END$$

DELIMITER ;
0 голосов
/ 26 марта 2020

Я проверил вашу функцию. Я получил эту ошибку.

ОШИБКА 1418 (HY000): Эта функция не имеет ни DETERMINISTI C, NO SQL, ни READS SQL DATA в своем объявлении, и двоичное ведение журнала включено ( вы могли бы захотеть использовать менее безопасную переменную log_bin_trust_function_creators)

Кстати, в будущем, когда вы обращаетесь за помощью с ошибкой, включает ошибку сообщение в вашем сообщении. Помогите нам помочь вам! Не заставляйте нас догадываться!

Прочитайте документацию о READS SQL DATA здесь: https://dev.mysql.com/doc/refman/8.0/en/stored-programs-logging.html

Поэтому я добавил эту опцию к вашей функции:

CREATE FUNCTION get_appli_name_by_email(ApliEMAIL VARCHAR(255)) 
RETURNS VARCHAR(255)
READS SQL DATA
BEGIN
DECLARE A_NAME VARCHAR(255) DEFAULT"";

  SELECT apli_fname  INTO   A_NAME
  FROM   tbl_signup
  WHERE  apli_email = ApliEMAIL;

  RETURN A_NAME;

END$$

Это работает сейчас:

mysql> select get_appli_name_by_email('thefrog@muppets.org');
+------------------------------------------------+
| get_appli_name_by_email('thefrog@muppets.org') |
+------------------------------------------------+
| Kermit                                         |
+------------------------------------------------+
...