首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL -创建用户定义函数(UDF)的麻烦

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

Stack Overflow用户
提问于 2011-07-08 17:53:48
回答 3查看 8.6K关注 0票数 2

我试图创建这个函数:

代码语言:javascript
复制
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秒您的SQL语法有错误;请检查与MySQL服务器版本对应的手册,以获得在第5行使用的正确语法。

我有什么错?在我看来,语法是正确的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-08 18:33:27

我找到了答案,这里

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

随附“-/”和"/“中的整个街区为我工作:

代码语言:javascript
复制
--/
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
/
票数 2
EN

Stack Overflow用户

发布于 2011-07-08 18:00:29

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

代码语言:javascript
复制
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行,正如错误消息所述),因此您将得到一个错误,因为这是无效的:

代码语言:javascript
复制
CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
  DECLARE i INT DEFAULT 1;

如果将分隔符更改为其他任何内容,MySQL将标识完整的命令(从CREATE FUNCTIONEND并运行它)。哇!您的函数被创建了。最后,在运行函数时,代码运行得很好,因为函数体由几个使用默认分隔符的语句组成。

票数 9
EN

Stack Overflow用户

发布于 2013-07-31 15:37:05

替代物

代码语言:javascript
复制
--/
CREATE FUNCTION ... 
/ 

是:

代码语言:javascript
复制
@delimiter $$;
CREATE FUNCTION ...
@delimiter ;$$

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6628390

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档