2

我正在尝试创建此功能:

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

但是 MySQL 说:

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

我有什么错?语法对我来说是正确的。

4

3 回答 3

9

您必须更改分隔符才能;在函数内部使用:

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 ;

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

CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;

如果您将分隔符更改为其他任何内容,MySQL 会识别完整的命令(from CREATE FUNCTIONtoEND并运行它。瞧!您的函数已创建。最后,当您运行您的函数时,代码运行良好,因为函数体由多个语句组成使用默认分隔符。

于 2011-07-08T18:00:29.237 回答
2

我在这里找到了答案。

我发现这是一些奇怪的 DB Visualizer 问题。

将完整的块包含在“--/”和“/”中对我有用:

--/
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
/
于 2011-07-08T18:33:27.140 回答
0

一个替代方案

--/
CREATE FUNCTION ... 
/ 

是:

@delimiter $$;
CREATE FUNCTION ...
@delimiter ;$$

更多信息:http ://www.dbvis.com/doc/main/doc/ug/sqlCommander/sqlCommander.html#mozTocId437790

于 2013-07-31T15:37:05.663 回答