2011-06-15 119 views
0

我有大约2年的mySQL在我的腰带,但我第一次潜入存储过程为我的网站创建一个内部分析工具。我通常善于跟踪SQL错误,但这个问题正在困扰着我。MySQL存储过程创建错误

我得到的错误是这样的:

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 '' at line 3

这是我执行收到此错误代码:

CREATE PROCEDURE STORE_ANALYTICS (IN chain VARCHAR(300)) 
BEGIN 
    UPDATE _analytics_clicks 
    SET chainCount = (chainCount + 1) 
    WHERE visitChain = chain; 

    IF SELECT ROW_COUNT() = 0 THEN 
     INSERT INTO _analytics_clicks (visitChain, chainCount) 
     VALUES (chain, 1); 
    END IF; 
END| 

值得注意的是我执行此之前,我执行

DELIMITER | 

我想改变的表的结构是这样的:

chainID int(11)  auto_increment 
visitChain varchar(300)  
chainCount int(11)  

当我自己执行第3行时,将visitChain = chain替换为visitChain ='0'(0是我发送的测试链),该命令正常运行并且chainCount递增。

为什么我得到这个错误/存储过程没有被创建的任何想法?

谢谢, 马特

编辑:

在SQL命令

包括分隔符:

DELIMITER | 
CREATE PROCEDURE STORE_ANALYTICS (IN chain VARCHAR(300)) 
BEGIN 
UPDATE _analytics_clicks SET chainCount = (chainCount+1) WHERE visitChain=chain; 
IF ROW_COUNT() = 0 THEN 
INSERT INTO _analytics_clicks (visitChain, chainCount) VALUES (chain, 1); 
END IF; 
END| 
DELIMITER ; 

给了我这个错误: 致命错误:在c突破300秒最大执行时间: \ wamp \ apps \ phpmyadmin3.2.0.1 \ libraries \ import \ sql.php on line 119

回答

0

你可以做

IF ROW_COUNT() = 0 THEN 

而不是IF SELECT ROW_COUNT() = 0 THEN。不需要SELECT

0

我怀疑你的分隔符没有正确设置。

我通常包括分隔符设置/取消语句我的SQL源,这样,“它只是运行” - 这是很好的做法,每一个SQL文件可以独立运行如:

delimiter ~ 

create procedure ... 

end;~ 

delimiter ; 

尝试改变你的分隔符到一个比管道字符更致命的东西 - 试试我的tilda ~ char,这从来没有给我任何麻烦。我也经常看到$$

+0

编辑原始帖子,因为当我在这里发布代码时,代码变得混乱起来,但是在SQL陈述中添加分隔符使其冻结。 – Matt 2011-06-15 03:36:21

+0

你如何提交给MySQL?也许那个管道正在妨碍 - 命令行解析为一个实际的管道?尝试直接在mysql命令行客户端中粘贴文件的内容。 – Bohemian 2011-06-15 03:42:54

+0

我使用PHP myadmin,我会尝试不同的分界符,但我不认为这会是一个问题。改变了Delim,仍然是我最后一次编辑的问题。嗯 – Matt 2011-06-15 04:10:44