параметр хранимой функции mysql - PullRequest
4 голосов
/ 19 октября 2010

Я только начал создавать хранимую функцию, это мой первый раз, поэтому у меня возникло несколько проблем.В настоящее время я вызываю функцию, используя SELECT 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.

AmЯ правильно понял, что ключевое слово 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 Ответ

4 голосов
/ 19 октября 2010

Использование:

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 $$

Помните, что длина VARCHAR значения RETURN соответствует переменной, которая должна соответствовать длине столбца, который вы хотите вернуть.

...