sql >> Base de Datos >  >> RDS >> Mysql

MySQL:problema con la creación de la función definida por el usuario (UDF)

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.