2011-08-20 27 views
2

的代碼是:爲什麼這個函數在DECLARE附近有一個語法錯誤?

DELIMITER $$ 
CREATE FUNCTION CHECK_AVABILITY(nama CHAR(30)) 
RETURNS INT(4) 
DECLARE vreturn INT(4); 
BEGIN 
IF nama = 'ika' THEN 
SET vreturn = 0; 
ELSE 
SET vreturn = 1; 
END IF 
RETURN vreturn; 
END $$ 

的錯誤信息是:

錯誤1064(42000):你已inyour SQL語法錯誤;檢查與你的MySQL服務器版本相對應的手冊,在'DECLARE vreturn INT4'附近使用正確的語法; BEGIN'

幫助表示讚賞。

+4

你有問題嗎? – Vache

+0

1064 ==無法創建過程或函數,通常是語法錯誤 –

回答

7

BEGIN/END塊內移動DECLARE vreturn INT(4)。您可能還需要在END IF之後的;。 此外,這看起來像是一個DETERMINISTIC函數。在BEGIN之前添加DETERMINISTIC關鍵字。

DELIMITER $$ 
CREATE FUNCTION CHECK_AVABILITY(nama CHAR(30)) 
RETURNS INT(4) 
DETERMINISTIC 
BEGIN 
    DECLARE vreturn INT(4); 
    IF nama = 'ika' THEN 
    SET vreturn = 0; 
    ELSE 
    SET vreturn = 1; 
    END IF; 
    RETURN vreturn; 
END $$ 
+0

感謝您的回答。 –

1

這是我關於這個問題的調查結果:

這是從手動報價:

「當你在程序中一個以上的語句需要一個BEGIN/END塊你。使用該塊附上多條語句

但是,這並不是全部。BEGIN/END塊也稱爲複合語句,您可以在其中定義變量和控制流。

換句話說:

(這些規則會以同樣的方式適用於觸發器和存儲過程,因爲它似乎相同的語法在兩個使用)

首先,注意流動控制關鍵字組,例如IF ... END IF或WHILE ... END WHILE被視爲單個語句,只要它以分號爲終止符,也就是說,它作爲一個整體終止於一個分號它的結尾:IF ... END IF; WHILE ... END WHILE ;.然後,如果觸發器或存儲過程的主體只包含一個stament,並且該語句不是上述關鍵字的變量聲明或流控制組,則該語句可能不會以分號(;)結尾。並且不包含在BEGIN ... END塊中。相反,如果觸發器或存儲過程的主體包含多個statern,並且特別是如果它包含變量聲明和/或流控制關鍵字組,則它必須包含在BEGIN中。 END塊。

最後,BEGIN ... END塊本身不能以分號結尾。

希望這會有所幫助。