MySQL - 创建用户定义函数(UDF)的麻烦

Gre*_*reg 1 mysql user-defined-functions dbvisualizer mysql-error-1064

我正在尝试创建此功能:

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC

BEGIN

  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';

  WHILE (i <= LENGTH(prm_strInput) )  DO
    SET v_char = SUBSTR(prm_strInput,i,1);

    IF v_char REGEXP '^[A-Za-z0-9]$' THEN
      SET v_parseStr = CONCAT(v_parseStr,v_char);  
    END IF;

    SET i = i + 1;
  END WHILE;

  RETURN trim(v_parseStr);
END
Run Code Online (Sandbox Code Playgroud)

但MySQL说:

13:52:45 [创建 - 0行,0.000秒] [错误代码:1064,SQL状态:42000]您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以便在第5行的''附近使用正确的语法

我怎么会错?语法对我来说是正确的.

Álv*_*lez 7

您必须更改分隔符,以便;在函数内部使用:

DELIMITER $$

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
  DECLARE v_char VARCHAR(1);
  DECLARE v_parseStr VARCHAR(3000) DEFAULT '';
WHILE (i <= LENGTH(prm_strInput) )  DO
  SET v_char = SUBSTR(prm_strInput,i,1);
  IF v_char REGEXP '^[A-Za-z0-9]$' THEN
        SET v_parseStr = CONCAT(v_parseStr,v_char);  
  END IF;
  SET i = i + 1;
END WHILE;
RETURN trim(v_parseStr);
END
$$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

更新:在MySQL中,默认分隔符是;.因此,当您键入原始代码时,MySQL认为第一个命令在;找到第一个命令的位置结束(在第5行,如错误消息所示),因此您会收到错误,因为这不是有效的SQL:

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;
Run Code Online (Sandbox Code Playgroud)

如果你改变了分隔符别的,MySQL的标识完整的命令(来自CREATE FUNCTIONEND并运行它.瞧!创建您的功能.最后,当你运行你的功能,代码,因为函数体是由多条语句的运行良好使用默认分隔符.