【问题标题】:Passing through parameters to stored procedures in mysql将参数传递给mysql中的存储过程
【发布时间】:2014-03-20 23:39:17
【问题描述】:

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

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 变量似乎没有正确设置。我错过了什么吗?

【问题讨论】:

    标签: mysql stored-procedures parameters


    【解决方案1】:

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

    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;
    

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-13
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      相关资源
      最近更新 更多