2012-08-24 95 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在乌尔声明,这应该工作:)