MySQL - Trouble with creating user defined function (UDF)

Greg picture Greg · Jul 8, 2011 · Viewed 8.1k times · Source

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.

Answer

&#193;lvaro Gonz&#225;lez picture Álvaro González · Jul 8, 2011

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 ;

In MySQL Command-Line Client (and many other SQL clients) 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.