2012-02-10 40 views
0

我想写简单的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 
+0

我希望您在使用新版本.. http://stackoverflow.com/questions/3356929/mysql-create-procedure-syntax-issue-line-1 – zod 2012-02-10 17:51:09

+0

我使用的MySQL 5.1 – Andna 2012-02-10 17:51:56

回答

2

的问题是,你拼错DECLARE

delcare dbRecord varchar(50); 

UPDATE :你的下一个错误,问题是你的非法使用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; 

附:为了避免业绩不佳对您的选择查询,你应该考虑使用排序规则是不区分大小写,所以你并不需要的功能LOWER()适用于ARTISTNAME列。

+0

我拼corectly现在宣布,但这个时候,我得到错误行14 – Andna 2012-02-10 18:10:46

+0

你的'不使用不支持EXISTS'。看到我更新的答案。 – 2012-02-10 18:24:09

+0

好吧,现在它可以工作。我甚至没有打这个用法不被支持,早期我用MSSQL,有是合法的使用这样的方式不存在。谢谢。 – Andna 2012-02-10 18:28:33