2012-08-24 35 views
1
DROP FUNCTION IF EXISTS shorten; 
delimiter $$ 
CREATE FUNCTION shorten(s VARCHAR(255), n INT) 
    RETURNS VARCHAR(255) 
BEGIN 
IF ISNULL(s) THEN 
    RETURN ''; 
ELSE IF n<15 THEN 
    RETURN LEFT(s, n); 
ELSE IF CHAR_LENGTH(s) <= n THEN 
    RETURN s; 
ELSE 
    RETURN CONCAT(LEFT(s, n-10), ' ... ', RIGHT(s, 5)); 
    END IF; 
END$$ 

的消息,我得到的是:的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 14 >

哪裏是德error..cause我是新來在MySQL製作功能。

UPDATE:

它指向一個錯誤與線之間的一些圓潤的問號:

ELSE IF n <15 THEN RETURN LEFT(s, n) ; 

ELSE IF CHAR_LENGTH(s) <= n THEN RETURN s; 

順便說一句,我用phpmyadmin

MySQL的版本是:mysqlnd 5.0。 10

+0

您是否嘗試過評估的這個較短的版本,看看你是否能縮小問題在哪裏?在這個版本中似乎沒有''''。 – tadman

+0

我認爲問題可能是你調用'delimiter $$',然後繼續使用';'作爲分隔符。 – murgatroid99

+1

@ murgatroid99當聲明一個過程,函數或觸發器時,這正是完成它的方式。 – Jocelyn

回答

1

我不知道BT我不明白你爲什麼關閉,如果(END IF;)兩次..? 這可能是您的代碼中可能存在的問題。請檢查它。並且ELSE IF應該沒有空間,即ELSEIF。 的代碼應該是:

DROP FUNCTION IF EXISTS shorten; 
delimiter $$ 
CREATE FUNCTION shorten(s VARCHAR(255), n INT) 
RETURNS VARCHAR(255) 
BEGIN 
IF ISNULL(s) THEN 
RETURN ''; 
ELSEIF n<15 THEN 
RETURN LEFT(s, n); 
ELSEIF CHAR_LENGTH(s) <= n THEN 
RETURN s; 
ELSE 
RETURN CONCAT(LEFT(s, n-10), ' ... ', RIGHT(s, 5)); 
    END IF; 
END;$$ 
delimiter; 
+0

#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第13行 –

+0

附近使用正確的語法,分隔符未正確關閉。這可能是一個原因。我已經更新了代碼。你可以請現在檢查它。並讓我知道它是否工作 – heretolearn

+0

您的SQL查詢已成功執行(查詢花了0.0003秒)..但我確實有一些錯誤的定界符 –

3

還有一個額外的END IF您需要刪除和替換ELSE IF通過ELSEIF

DROP FUNCTION IF EXISTS shorten; 
delimiter $$ 
CREATE FUNCTION shorten(s VARCHAR(255), n INT) RETURNS VARCHAR(255) 
BEGIN 
IF ISNULL(s) THEN 
    RETURN ''; 
ELSEIF n<15 THEN 
    RETURN LEFT(s, n); 
ELSEIF CHAR_LENGTH(s) <= n THEN 
    RETURN s; 
ELSE 
    RETURN CONCAT(LEFT(s, n-10), ' ... ', RIGHT(s, 5)); 
END IF; 
END$$ 

最後的錯誤梅德了,是因爲一個額外的分號:

WRONG code: delimiter $$; 
GOOD code: delimiter $$ 
+0

現在我用你的代碼得到這個:#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第13行 –

+0

的附近使用正確的語法是,報告的錯誤位於第一個ELSE IF上。我會修復 – Jocelyn

+0

@DmitryMakovetskiyd:代碼現在可以正常工作,試試吧。 – Jocelyn

1

因爲如果真正的MySQL語法THEN ELSE是

IF THEN 
    ELSEIF THEN 
    ELSE 
    END IF 

事實上,你正在使用ELSE IF而是由ELSEIF取代它,它去上班

參考:http://dev.mysql.com/doc/refman/5.0/en/if.html

DROP FUNCTION IF EXISTS shorten; 

delimiter $$ 
CREATE FUNCTION shorten(s VARCHAR(255), n INT) 
RETURNS VARCHAR(255) 
BEGIN 
IF ISNULL(s) THEN 
RETURN ''; 
ELSEIF n<15 THEN 
RETURN LEFT(s, n); 
ELSEIF CHAR_LENGTH(s) <= n THEN 
RETURN s; 
ELSE 
RETURN CONCAT(LEFT(s, n-10), ' ... ', RIGHT(s, 5)); 
    END IF; 

END$$ 
+0

#1064 - 你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第14行的''附近使用正確的語法。 –

+0

這適用於我的機器。運行'SELECT shorten(「This is a test」,3)'我得到期望的輸出:'Thi' – Touki

+0

也運行在我的..在sshekhar代碼 –

1
CREATE FUNCTION shorten(s VARCHAR(255), n INT) 
RETURNS VARCHAR(255) 
BEGIN 
IF ISNULL(s) THEN 
RETURN ''; 
ELSEIF n<15 THEN 
RETURN LEFT(s,n); 
ELSE 
IF CHAR_LENGTH(s) <= n THEN 
RETURN s; 
ELSE 
RETURN CONCAT(LEFT(s, n-10), '... ',RIGHT(s,5)); 
END IF; 
END IF; 
END$$ 

嘗試包括一個更END IF在烏爾聲明,這應該工作:)