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

将参数传递到mysql中的存储过程,mysql,stored-procedures,parameters,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_n

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

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)
$$
正在创建用户并将其正确地放入组中,但由于某些原因,似乎没有向用户\u UpdatePassword传递正确的参数。我知道用户\u UpdatePassword可以工作,因为如果我调用 调用用户\u UpdatePassword('newlogin','P@ssword")$$


调用用户_Create后,它工作正常。当从另一个存储过程中调用User_UpdatePassword时,似乎pwd变量设置不正确。我遗漏了什么吗?

我确信问题是因为您的参数与表中的列名称完全相同。这只会带来问题。下面是修复的第一个存储过程:

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;
如果修复了另一个存储过程,则应该解决该问题

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