#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 будет равно «Имя пользователя не найдено». Еще раз спасибо.