2010-10-19 110 views
4

我剛開始創建存儲函數,這是我第一次,所以我有幾個問題。目前我使用SELECT test();來調用函數(測試是現在的函數名稱)。我想發送一個號碼給該功能(用戶名ID)並返回用戶名。mysql存儲函數參數

我有這個工作通過使用SELECT test(1); 1是表中的用戶的ID。這似乎是作爲用戶名返回,但如果我輸入任何數字相同的用戶名也返回。

BEGIN 

DECLARE new_username VARCHAR(90);  

    SELECT `username` INTO new_username FROM `users` WHERE `ID` = ID; 

return new_username; 
END 

我已經設置參數爲ID int

我是否認爲關鍵字INTO會將用戶名的值放入變量new_username?如果我沒有INTO運行它,我得到的錯誤:

Not allowed to return a result set from a function

有我在此做出任何明顯的失誤,我希望我沒有做過完全錯誤。感謝您的任何建議:)。

編輯:我只是增加了一些行到我的表,我現在得到的錯誤:

Result consisted of more than one row

完整的SQL版本:

CREATE DEFINER=`elliotts`@`%` FUNCTION `test`(ID int) 
RETURNS varchar(32) CHARSET latin1 
BEGIN 

    DECLARE new_username VARCHAR(32); 

    SELECT `username` 
     INTO new_username 
     FROM `users` 
    WHERE `ID` = ID; 

    return new_username; 

END 

回答

4

用途:

DROP FUNCTION IF EXISTS `example`.`test` $$ 
CREATE FUNCTION `example`.`test` (param INT) RETURNS VARCHAR(32) 
BEGIN 

    DECLARE new_username VARCHAR(32); 

    SELECT `username` 
     INTO new_username 
     FROM `users` 
    WHERE `ID` = param; 

    RETURN COALESCE(new_username, 'Username not found'); 

END $$ 

請注意,RETURN值的VARCHAR長度與變量sho匹配與你想要返回的列長相匹配。

+0

謝謝我試過,但得到的錯誤: 無法在另一個存儲的例程中創建一個功能 – Elliott 2010-10-19 15:56:25

+0

@Elliot:在單獨的腳本選項卡中執行代碼 - 不知何故,你已經設法將其粘貼到一個現有的函數/存儲過程聲明。 – 2010-10-19 15:58:31

+0

@Elliot:如果用戶名爲NULL,你想做什麼?你知道如果有人用表中不存在的參數值運行函數,那麼返回值也是NULL? – 2010-10-19 17:39:43