2013-03-21 62 views
2

的MySQL創建函數失敗

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 

BEGIN 
DECLARE tagID BIGINT; 
      SET tagID = (SELECT id FROM tags WHERE text = tag); 
IF tagID IS NULL 
THEN 
      (INSERT INTO tags (text) VALUES (tag)); 
      SET tagID = (SELECT LAST_INSERT_ID()); 
END IF; 
RETURN tagID; 
END 

失敗

您的SQL語法錯誤;請檢查與您的MySQL服務器版本對應的手冊,以便在第4行使用正確的語法。

爲什麼?

此功能與這裏的問題:

mysql insert if not exists on joined tables

+0

您是否將分隔符設置爲與';'不同的內容? – 2013-03-21 13:09:39

回答

3

嘗試改變DELIMITER並刪除周圍的INSERT聲明括號。

DELIMITER $$ 
CREATE FUNCTION getTagID(tag VARCHAR(100)) 
RETURNS BIGINT 
BEGIN 
    DECLARE tagID BIGINT; 
    SET tagID = (SELECT id FROM tags WHERE text = tag); 
    IF tagID IS NULL THEN 
     INSERT INTO tags (text) VALUES (tag); -- don't put inside parenthesis 
     SET tagID = (SELECT LAST_INSERT_ID()); 
    END IF; 
    RETURN tagID; 
END $$ 
DELIMITER ; 
+0

似乎工作,你是我今天的英雄......但你能解釋「DELIMITER」有什麼事嗎? – 2013-03-21 13:12:13

+0

'DELIMITER'更改查詢中的終止符號,並允許您執行包含';'的多個語句。請記住,';'後面的每一行都會關閉語句,這就是爲什麼當更改爲另一個符號時,您可以執行多個語句而不破壞它。 – 2013-03-21 13:14:07

+1

太好了,謝謝。獲得的經驗 – 2013-03-21 13:16:35

2

類型設置分隔符來;;這樣的:

DELIMITER ;; 

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 
BEGIN 
    DECLARE tagID BIGINT; 
    SET tagID = (SELECT id FROM tags WHERE text = tag); 
    IF tagID IS NULL 
    THEN 
    INSERT INTO tags (text) VALUES (tag); 
    SET tagID = (SELECT LAST_INSERT_ID()); 
    END IF; 
    RETURN tagID; 
END;; 

DELIMITER ; 

定界符用於通過MySQL客戶端(未切斷),以輸入分割成單獨的查詢。默認的分隔符是;因此MySQL客戶端發送以下查詢到服務器:

CREATE FUNCTION getTagID(tag VARCHAR(100)) RETURNS BIGINT 

BEGIN 
DECLARE tagID BIGINT 

這是不完整的,因而不正確。

+0

很好的解釋,謝謝 – 2013-03-21 13:16:17