параметр хранимых функций mysql

#mysql

#sql #mysql #хранимые функции

Вопрос:

Я только начал создавать хранимую функцию, это мой первый раз, поэтому у меня возникли несколько проблем. В настоящее время я вызываю функцию с помощью SELECT test(); (test — это имя функции на данный момент). Я хочу отправить число функции (идентификатор имени пользователя) и вернуть имя пользователя.

У меня это работает, используя SELECT test(1); 1 — идентификатор пользователя в таблице. Кажется, это работает, поскольку возвращается имя пользователя, но если я введу любое число, то также возвращается то же имя пользователя.

 BEGIN 

 DECLARE new_username VARCHAR(90);    

    SELECT `username` INTO  new_username FROM `users` WHERE `ID` = ID;

 return new_username;
END
  

Я установил параметр как ID int .

Правильно ли я понимаю, что ключевое INTO слово помещает значение имени пользователя в переменную new_username ? Если я запускаю его без INTO , я получаю сообщение об ошибке:

Не разрешено возвращать результирующий набор из функции

Допустил ли я какие-либо очевидные ошибки в этом, надеюсь, я не сделал это совершенно неправильно. Спасибо за любой совет :).

Редактировать: я только что добавил еще несколько строк в свою таблицу, теперь я получаю сообщение об ошибке:

Результат состоял из более чем одной строки

Полная версия sql:

 CREATE DEFINER=`elliotts`@`%` FUNCTION `test`(ID int) 
RETURNS varchar(32) CHARSET latin1
BEGIN 

    DECLARE new_username VARCHAR(32);

    SELECT `username` 
      INTO new_username 
      FROM `users` 
     WHERE `ID` = ID;

    return new_username;

END
  

Ответ №1:

Использовать:

 DROP FUNCTION IF EXISTS `example`.`test` $$
CREATE FUNCTION `example`.`test` (param INT) RETURNS VARCHAR(32)
BEGIN

  DECLARE new_username VARCHAR(32);

    SELECT `username`
      INTO new_username
      FROM `users`
     WHERE `ID` = param;

    RETURN COALESCE(new_username, 'Username not found');

END $$
  

Имейте в виду, что длина переменной ВОЗВРАЩАЕМОГО значения соответствует переменной, которая должна соответствовать длине столбца, которую вы хотите вернуть.

Комментарии:

1. Спасибо, я попробовал это, но получил сообщение об ошибке: невозможно создать ФУНКЦИЮ из другой сохраненной процедуры

2. @Elliot: выполните код на отдельной вкладке скрипта — каким-то образом вам удалось вставить его в существующее объявление функции / хранимой процедуры.

3. @Elliot: Что вы хотите сделать, если имя пользователя равно NULL? Вы понимаете, что возвращаемое значение также будет равно NULL, если кто-то запускает функцию со значением параметра, которого нет в таблице?

4. Да, я проверяю, если он не существует, тогда new_username будет равно «Имя пользователя не найдено». Еще раз спасибо.