2011-06-15 153 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