2010-10-19 73 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