我正在尝试创建此功能:
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 [CREATE - 0行,0.000秒] [错误代码:1064,SQL状态:42000]您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以便在第5行的''附近使用正确的语法
我有什么不对的?语法对我来说是正确的。
答案 0 :(得分: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 ;
更新:在MySQL中,默认分隔符为;
。因此,当您键入原始代码时,MySQL认为第一个命令在找到第一个;
的位置结束(在第5行,如错误消息所示),因此您会收到错误,因为这不是有效的SQL:< / p>
CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
如果将分隔符更改为其他任何内容,MySQL会识别完整的命令(从CREATE FUNCTION
到END
并运行它.Voilá!您的函数已创建。最后,当您运行函数时,代码运行得很好,因为函数体由几个使用默认分隔符的语句组成。
答案 1 :(得分:2)
我找到了答案here。
我发现这是一个奇怪的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
/
答案 2 :(得分:0)
的替代方案
--/
CREATE FUNCTION ...
/
是:
@delimiter $$;
CREATE FUNCTION ...
@delimiter ;$$
更多信息:http://www.dbvis.com/doc/main/doc/ug/sqlCommander/sqlCommander.html#mozTocId437790