Синтаксис хранимой процедуры Mysql

Я пытаюсь написать простую хранимую процедуру mysql, и кажется, что я не могу понять, до сих пор у меня есть

delimiter //
 create procedure addRecord(_login varchar(15),_artist varchar(50),_record varchar(50))
 begin
 declare dbArtist varchar(50);
 delcare dbRecord varchar(50);

 set dbArtist = (select artistname from artists where lower(artistname) = lower(_artist));

 set dbRecord=(select recordname from records where lower(recordname)=lower(_record));
 if not exists (select * from Artists where lower(artistname)=lower(_artist)) then
 begin
 INSERT INTO 'Artists'('ArtistName') VALUES (_artist);
 set dbArtist=_artist;
 end

 if not exists (select * from Records as R inner join Artists as A on R.ArtistId=A.ArtistId where lower(R.RecordName)=lower(_record) and A.ArtistName=dbArtist) then
 begin
 INSERT INTO 'Records'('ArtistId', 'RecordName') VALUES ((select artistid from artists where artistname=dbArtist),_record);
 set dbRecord=_record;
 end

 end

но я получаю синтаксическую ошибку в строке 4:

#1064 - You have an error in your SQL syntax; check the manual that corresponds 
to your MySQL server version for the right syntax to use near 'dbRecord varchar(50);
set dbArtist = (select artistname from artists where lowe' at line 4

эта ошибка сообщения была возвращена мне phpMyAdmin, может ли кто-нибудь сказать мне, почему я получаю сообщение об ошибке?

изменение: измененная версия, все еще не очень хорошая

delimiter //
create procedure addRecord(_login varchar(15),_artist varchar(50),_record varchar(50))
begin
declare dbArtist varchar(50);
declare dbRecord varchar(50);

set dbArtist = (select artistname from artists where lower(artistname) = lower(_artist));
set dbRecord=(select recordname from records where lower(recordname)=lower(_record));
if not exists (select * from Artists where lower(artistname)=lower(_artist)) then
begin
 INSERT INTO 'Artists'('ArtistName') VALUES (_artist);
 set dbArtist=_artist;
end

if not exists 
(select * from Records as R inner join Artists as A on R.ArtistId = A.ArtistId where lower(R.RecordName)=lower(_record) and A.ArtistName=dbArtist) 
then
begin
 INSERT INTO 'Records'('ArtistId', 'RecordName') VALUES ( (select artistid from artists where artistname=dbArtist) ,_record);
 set dbRecord=_record;
end

end

теперь ошибка в строке 14 и сообщение:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'if not exists (select * from Records as R inner join Artists as A on R.ArtistId' at line 14
1 ответ

Проблема в том, что вы с ошибкой DECLARE:

delcare dbRecord varchar(50);

ОБНОВЛЕНИЕ: для вашей следующей ошибки проблема заключается в незаконном использовании NOT EXISTS.

Внутри хранимой процедуры правильный подход состоит в том, чтобы подсчитать существующие строки, а затем условно вставить значение, если счетчик равен 0.

Что-то вроде этого:

SELECT COUNT(*)
INTO @v_row_count
FROM Artists 
WHERE LOWER(artistname)=LOWER(_artist);

IF (@v_row_count = 0)
THEN
 INSERT INTO 'Artists'('ArtistName') VALUES (_artist);
 set dbArtist=_artist;
END IF;

PS Чтобы избежать плохой производительности в выбранном вами запросе, вы должны рассмотреть возможность использования сортировки, которая не учитывает регистр, поэтому вам не нужно применять функцию LOWER() к столбцу Artistname.

licensed under cc by-sa 3.0 with attribution.