sql >> Databáze >  >> RDS >> Mysql

MySQL - Potíže s vytvořením uživatelem definované funkce (UDF)

Musíte změnit oddělovač, abyste mohli použít ; uvnitř funkce:

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 ;

V klient příkazového řádku MySQL (a mnoho dalších SQL klientů) výchozí oddělovač je ; . Takže když napíšete svůj původní kód, MySQL si myslí, že první příkaz končí tam, kde první ; je nalezen (na řádku 5, jak uvádí chybová zpráva), takže se zobrazí chyba, protože toto není platné SQL:

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

Pokud změníte oddělovač na cokoliv jiného, ​​MySQL identifikuje celý příkaz (z CREATE FUNCTION do END a provozuje to. Voilá! Vaše funkce je vytvořena. Nakonec, když spustíte svou funkci, kód běží v pořádku, protože tělo funkce se skládá z několika příkazů s výchozím oddělovačem.



  1. Jak mohu zkombinovat více řádků do seznamu odděleného čárkami v SQL Server 2005?

  2. Aktualizujte primární klíč Django MySQL

  3. Jak GROUP BY DESC vybírá své pořadí?

  4. Jednoduchý dotaz k získání maximální hodnoty pro každé ID