Tienes que cambiar el delimitador para poder usar ;
dentro de la función:
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 ;
En Cliente de línea de comandos MySQL
(y muchos otros clientes SQL) el delimitador predeterminado es ;
. Entonces, cuando escribe su código original, MySQL piensa que el primer comando termina donde el primer ;
se encuentra (en la línea 5, como indica el mensaje de error), por lo que obtiene un error porque este SQL no es válido:
CREATE FUNCTION remove_non_alphanum (prm_strInput varchar(3000))
RETURNS VARCHAR(3000)
DETERMINISTIC
BEGIN
DECLARE i INT DEFAULT 1;
Si cambia el delimitador a cualquier otra cosa, MySQL identifica el comando completo (desde CREATE FUNCTION
para END
y lo ejecuta. ¡Voila! Se crea su función. Finalmente, cuando ejecuta su función, el código funciona bien porque el cuerpo de la función se compone de varias declaraciones que usan el delimitador predeterminado.