将参数传递给mysql中的存储过程

时间:2014-03-20 23:39:18

标签: mysql stored-procedures parameters

我有一个带有以下签名的存储过程:

CREATE DEFINER=`prod`@`%` PROCEDURE `User_Create`(IN login VARCHAR(45), IN pwd VARCHAR(45), IN fname VARCHAR(45), IN lname VARCHAR(45), IN email VARCHAR(45), IN group_name VARCHAR(45))
BEGIN
    INSERT INTO `Users` (`login`, `first_name`, `last_name`, `email`, `create_time`)
    SELECT login, fname, lname, email, NOW();

    CALL User_UpdatePassword(login, pwd);

    INSERT INTO UserGroupsUsers (`group_id`, `user_id`)
    SELECT ug.id, u.id
    FROM UserGroups ug, Users u
    WHERE ug.`name` = group_name AND u.`login` = login;

END

另一个像这样:

CREATE DEFINER=`prod`@`%` PROCEDURE `User_UpdatePassword`(IN login VARCHAR(45), IN newpassword VARCHAR(45))
BEGIN

    -- Note that in mysql 5.5.32 SHA2 returns hex so we need to use unhex before calling BASE64_ENCODE
    UPDATE Users u, 
    (
        SELECT CONVERT(BASE64_ENCODE(unhex(SHA2(CONVERT(CONCAT(newpassword, `salt`) USING UTF8), 512))) USING utf8) AS `newpassword`, CONVERT(`salt` using UTF8) AS `newsalt`, length(salt) as saltlength
        FROM (SELECT BASE64_ENCODE(substring(CONCAT(md5(rand()),md5(rand())), 1, 48)) AS `salt`) t1
    ) pwd
    SET u.`password` = pwd.`newpassword`, u.`salt` = pwd.`newsalt`
    WHERE u.`login` = login;
END

我似乎遇到的问题是:

SET @login = 'newlogin' $$
SET @fname = 'Ben' $$
SET @lname = 'Bobbers' $$
SET @email = 'ben@bobbers.com' $$
SET @pwd = 'P@ssword' $$
SET @grpname = 'GrpName' $$

CALL User_Create(@newuser_login, @pwd, @first_name, @last_name, @email, @grpname)
$$

正在创建用户并将其正确放入组中,但由于某种原因,User_UpdatePassword似乎没有在正确的参数中传递。我知道User_UpdatePassword可以工作,因为如果我然后调用 调用User_UpdatePassword('newlogin','P @ ssword')$$

调用User_Create后,它工作正常。不知何故,当从另一个存储过程内部调用User_UpdatePassword时,似乎没有正确设置pwd变量。我错过了什么?

1 个答案:

答案 0 :(得分:0)

我确定问题是因为您的参数与表中的列完全相同。这只会引发问题。这是第一个修复的存储过程:

CREATE DEFINER=`prod`@`%` PROCEDURE `User_Create` (
    IN v_login VARCHAR(45),
    IN v_pwd VARCHAR(45),
    IN v_fname VARCHAR(45),
    IN v_lname VARCHAR(45),
    IN v_email VARCHAR(45),
    IN v_group_name VARCHAR(45)
)
BEGIN
    INSERT INTO `Users`(`login`, `first_name`, `last_name`, `email`, `create_time`)
        SELECT v_login, v_fname, v_lname, v_email, NOW();

    CALL User_UpdatePassword(v_login, v_pwd);

    INSERT INTO UserGroupsUsers(`group_id`, `user_id`)
        SELECT ug.id, u.id
        FROM UserGroups ug join
             Users u
             on ug.`name` = v_group_name AND u.`login` = v_login;
END;

如果您修复了其他存储过程,则应该解决问题。

请注意,我还修复了过时的连接语法。