MySQL - Trouble with creating user defined functio

2019-02-27 18:55发布

I'm trying to create this function:

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

But MySQL says:

13:52:45 [CREATE - 0 row(s), 0.000 secs] [Error Code: 1064, SQL State: 42000] You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5

What could I being wrong? The syntax looks correct to me.

3条回答
Juvenile、少年°
2楼-- · 2019-02-27 19:22

You have to change the delimiter so you can use ; inside the function:

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 ;

Update: In MySQL, the default delimiter is ;. So, when you type your original code, MySQL thinks the first command ends where the first ; is found (at line 5, as the error message states), thus you get an error because this is not valid SQL:

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

If you change the delimiter to anything else, MySQL identifies the complete command (from CREATE FUNCTION to END and runs it. Voilá! Your function is created. Finally, when you run your function, the code runs just fine because the function body is composed of several statements using the default delimiter.

查看更多
祖国的老花朵
3楼-- · 2019-02-27 19:27

I found the answer here.

I turns out it was some weird DB Visualizer issue.

Enclosing the complete block in "--/" and "/" worked for me:

--/
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
/
查看更多
我只想做你的唯一
4楼-- · 2019-02-27 19:28

An alternative to

--/
CREATE FUNCTION ... 
/ 

is:

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

More info: http://www.dbvis.com/doc/main/doc/ug/sqlCommander/sqlCommander.html#mozTocId437790

查看更多
登录 后发表回答