Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL - Problemi con la creazione della funzione definita dall'utente (UDF)

Devi cambiare il delimitatore in modo da poter usare ; all'interno della funzione:

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 Client della riga di comando MySQL (e molti altri client SQL) il delimitatore predefinito è ; . Quindi, quando digiti il ​​codice originale, MySQL pensa che il primo comando termini dove il primo ; viene trovato (alla riga 5, come afferma il messaggio di errore), quindi ottieni un errore perché questo non è un SQL valido:

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

Se modifichi il delimitatore con qualcos'altro, MySQL identifica il comando completo (da CREATE FUNCTION a END e lo esegue. Ecco! La tua funzione è stata creata. Infine, quando esegui la tua funzione, il codice funziona correttamente perché il corpo della funzione è composto da diverse istruzioni che utilizzano il delimitatore predefinito.