2015-09-13 2 views
0

На данный момент я пытаюсь создать процедуру в моем Databse с этим запросом:Создать процедуру в SQL терпит неудачу

CREATE PROCEDURE InsertTitle(title VARCHAR(50), interpret VARCHAR(50), album VARCHAR(50)) 
BEGIN 
    INSERT IGNORE INTO Interpret (Name) VALUES (interpret); 
    SET @idInterpret := (SELECT id FROM Interpret WHERE Name = interpret); 

    INSERT IGNORE INTO Album (Name, Interpret) VALUES (@album, @idInterpret); 
    SET @idAlbum := (SELECT id FROM Interpret WHERE Name = album AND Interpret = @idInterpret); 

    INSERT INTO Lied (Name, Album, Interpret) VALUES (title, @idAlbum, @idInterpret,); 
END; 

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

У вас возникла ошибка в синтаксисе SQL; в руководстве, соответствует версии сервера MySQL для правильного синтаксиса использовать около «» в строке 3

Есть ли у вас представление о том, где моя ошибка есть? Я использую сервер MySQL.

+0

использовать 'DELIMITER //' наверху (и заканчивать и возвращать соответствующим образом) – amdixon

ответ

1

Во-первых, ваша проблема может быть просто разделителями. Во-вторых, вы неправильно подходите к вычислению вставленного id. Вы должны использовать LAST_INSERT_ID():

DELIMITER $$ 

CREATE PROCEDURE InsertTitle(title VARCHAR(50), interpret VARCHAR(50), album VARCHAR(50)) 
BEGIN 
    INSERT IGNORE INTO Interpret (Name) 
     VALUES (interpret); 
    SELECT @idInterpret :-= LAST_INSERT_ID() 

    INSERT IGNORE INTO Album (Name, Interpret) 
     VALUES (@album, @idInterpret); 
    SELECT @idAlbum := LAST_INSERT_ID() 

    INSERT INTO Lied (Name, Album, Interpret) 
     VALUES (title, @idAlbum, @idInterpret); 
END; 
$$ 
DELIMITER ; 

Кроме того, set использует =, не :=. Последнее необходимо только в заявках SELECT. И у вас была дополнительная запятая в последнем заявлении VALUES().

+0

Но если вставка не работает, LAST_INSERT_ID() 'выдаст неверный идентификатор или я ошибаюсь? – Cilenco

+0

@Cilenco. , , Я думаю, что он возвращает 'NULL' (или значение не определено). Тем не менее, ваш код имеет «INSERT IGNORE», который не кажется хорошей идеей. Но это не имеет никакого отношения к тому, чтобы код анализировался и функционировал. –

+0

OKay спасибо за это. Какая альтернатива IGNORE? И можете ли вы вкратце объяснить, что делает DELIMITER? – Cilenco

0

Попробуйте использовать это решение:

delimiter // 
CREATE PROCEDURE InsertTitle(title VARCHAR(50), interpret VARCHAR(50), album VARCHAR(50)) 
BEGIN 
    INSERT IGNORE INTO Interpret (Name) VALUES (interpret); 
    SET @idInterpret := (SELECT id FROM Interpret WHERE Name = interpret); 

    INSERT IGNORE INTO Album (Name, Interpret) VALUES (@album, @idInterpret); 
    SET @idAlbum := (SELECT id FROM Interpret WHERE Name = album AND Interpret = @idInterpret); 

    INSERT INTO Lied (Name, Album, Interpret) VALUES (title, @idAlbum, @idInterpret,); 
END// 
delimiter ; 

Для получения более подробной информации смотрите: MySQL CREATE PROCEDURE

Смежные вопросы