为什么这个函数在DECLARE附近有语法错误?

时间:2011-08-20 02:01:13

标签: mysql function

代码是:

DELIMITER $$
CREATE FUNCTION CHECK_AVABILITY(nama CHAR(30))
RETURNS INT(4)
DECLARE vreturn INT(4);
BEGIN
IF nama = 'ika' THEN
SET vreturn = 0;
ELSE
SET vreturn = 1;
END IF
RETURN vreturn;
END $$

错误消息是:

  
    

错误1064(42000):你的sql语法错误;检查与MySQL服务器版本对应的手册,以便在“DECLARE vreturn INT4”附近使用正确的语法; BEGIN“

  

非常感谢帮助。

2 个答案:

答案 0 :(得分:6)

DECLARE vreturn INT(4)块内移动BEGIN / END。在;之后,您可能还需要END IF。 此外,这看起来像是DETERMINISTIC函数。在DETERMINISTIC之前添加BEGIN关键字。

DELIMITER $$
CREATE FUNCTION CHECK_AVABILITY(nama CHAR(30))
RETURNS INT(4)
DETERMINISTIC
BEGIN
  DECLARE vreturn INT(4);
  IF nama = 'ika' THEN
    SET vreturn = 0;
  ELSE
    SET vreturn = 1;
  END IF;
  RETURN vreturn;
END $$

答案 1 :(得分:1)

以下是我对该主题的调查结果:

这是手册中的引用:

“当程序中有多个语句时,您需要一个BEGIN / END块。您可以使用该块来包含多个语句。

但这不是全部。 BEGIN / END块也称为复合语句,是您可以定义变量和控制流的地方。“

换句话说:

(这些规则似乎以相同的方式应用于触发器和存储过程,因为它们似乎使用了相同的语法。)

首先,请注意,关于诸如IF ... END IF或WHILE ... END WHILE之类的关键字的流控制组被视为单个语句,只要它以分号终止,即它是在它结束时由一个分号整体终止:IF ... END IF; WHILE ...结束时;。

然后,如果触发器或存储过程的主体只包含一个stament,并且该语句不是变量声明,也不是上述关键字的流控制组,则该语句可能不会以分号(;)结束。没有被BEGIN ... END块包围。

相反,如果触发器或存储过程的主体包含多个stament,特别是如果它包含变量声明和/或关键字的流控制组,那么它必须包含在BEGIN ... END中块。

最后,BEGIN ... END块本身不能以分号结束。

希望这有帮助。