1

我試圖創建此功能的用戶定義函數(UDF):MySQL的 - 故障與創建

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 

但MySQL的說:

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

什麼我可以是錯了嗎?語法對我來說看起來是正確的。

+0

評論事情(在這種情況下,從WHILE循環中的IF開始),一次一個測試以更好地確定問題。 –

+0

其實我是應該在查詢窗口中運行這個?這個頁面似乎意味着我需要首先編譯一個UDF http://dev.mysql.com/doc/refman/5.0/en/adding-functions.html – Greg

+0

@Greg,如果你正在編寫一個函數在C語言中。你的代碼是SQL。 –

回答

2

我找到了答案here

我發現這是一些奇怪的DB Visualizer問題。

內附完整的塊 「 - /」 和我 「/」 工作:

--/ 
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 
/
7

你必須改變的分隔符,所以你可以使用;在函數內部:

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 ; 

更新:在MySQL中,默認的分隔符是;。所以,當你鍵入你的原始代碼時,MySQL會認爲第一個命令在第一個找到的地方(在第5行,因爲錯誤消息指出)結束,因此你得到一個錯誤,因爲這是無效的SQL:

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

如果您將分隔符更改爲其他任何內容,MySQL會標識完整的命令(從CREATE FUNCTIONEND並運行它。)創建您的函數。最後,當您運行函數時,代碼運行得很好,因爲函數體是由幾個使用默認分隔符的語句組成

+0

我不明白爲什麼這將需要 – Greg

+0

嗯,現在我得到這個錯誤:14:20:15 [DELIMITER - 0行(s),0.000秒] [錯誤代碼:1064,SQL狀態:42000]你有一個您的SQL語法錯誤;請查看與您的MySQL服務器版本相對應的手冊,以在'DELIMITER $$ – Greg

+0

@Greg附近使用正確的語法,請參閱我的更新答案。 –