Синтаксис хранимой процедуры Mysql - PullRequest
0 голосов
/ 10 февраля 2012

Я пытаюсь написать простую хранимую процедуру 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 Ответ

2 голосов
/ 10 февраля 2012

Проблема в том, что вы ошиблись 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;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...