Функции MySQL: ошибка № 1064
Я получаю сообщение об ошибке: #1064 - у вас есть ошибка в вашем синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать вблизи 'IN GenreID INT(11), OUT AlbumName VARCHAR(30)) НАЧАТЬ ВЫБРАТЬ AlbumName INTO Na' в строке 1
Мой код:
CREATE FUNCTION get_album_info_for_genre (IN GenreID INT(11), OUT AlbumName
VARCHAR(30))
BEGIN
SELECT AlbumName INTO NameOfAlbum FROM Albums WHERE GenreID=GenreID;
END
Я в PhpMyAdmin и пытаюсь написать некоторые функции для музыкальной базы данных. Я хотел бы написать тот, который отображает имя исполнителя, название жанра и название альбома, если пользователь выбирает определенный жанр (показывать только альбомы и исполнителей в этом жанре) или если он выбирает исполнителя наоборот.
Я решил начать с простого и просто показать название альбома в зависимости от жанра, который они выбрали.
При необходимости моя структура таблицы:
Альбомы: AlbumID, GenreID, ArtistID, AlbumName
Жанры: GenreID, GenreName
Исполнители: ArtistID, ArtistName
Я попытался изменить, где это было Na на что-то другое, но я все еще получил ошибку. Я также попытался изменить разделитель, но это тоже не помогло. Обратите внимание, что phpmyadmin по умолчанию имеет; в качестве разделителя. Я попытался добавить $$ вверху и внизу, но все равно получил ошибку 1064. По какой-то причине я не могу найти много статей или видео о функциях mysql. Хранимых процедур очень много, но я искал 4 дня, и единственное место, где я видел людей, пишущих функции, было здесь, на stackru. Я посмотрел на пару вопросов, которые получили эту ошибку, но и попробовал некоторые из решений, но все же должно быть упущено что-то очевидное.
РЕДАКТИРОВАТЬ - Я попытался изменить синтаксис, чтобы удалить IN и OUT и получить ту же ошибку, но в другом месте - синтаксис для использования рядом с "НАЧАТЬ ВЫБРАТЬ Имя альбома INTO NameOfAlbum ИЗ альбомов ГДЕ GenreID=GenreID" в строке 2
1 ответ
Функция принимает значение и возвращает значение. Синтаксис функции не должен знать направление параметра (вход или выход), так как логически существует только вход, но ему нужно знать атрибуты того, что возвращается (определяется оператором Returns). Оператор Return в функции завершает код и передает переменную оператору Returns, и функция завершает работу. Так что этот код должен скомпилироваться. Если вы делаете это из запроса, измените разделитель с; в $$ (не забудьте поменять его обратно). Если вы делаете это с помощью клавиши табуляции процедур в зависимости от ситуации.
CREATE DEFINER=`root`@`localhost` FUNCTION `get_album_info_for_genre`(`INGenreID` INT(11)) RETURNS VARCHAR(100) CHARSET latin1
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
BEGIN Declare outs varchar(100);
SELECT AlbumName INTO outs FROM Albums WHERE GenreID=INGenreID;
RETURN outs;
END
Возможно, вам придется выяснить, кто ваш выбор для вашего магазина.
Примечание: если в каждом жанре много альбомов, функция может быть не той, что вы хотите.