MySQL存储过程 - 如果EXISTS ...然后返回意外结果

时间:2016-06-26 17:02:51

标签: mysql stored-procedures mysql-routines

以下是我的存储过程(例程),用于检查数据库中是否存在具有用户名(输入)的用户。 在数据库中,我已经拥有用户名的用户 - ' dev'。 但是,当我运行以下例行程序时,它返回 res = 1 ,我预期它为-1

我用这种方式调用例行程序。如果我以错误的方式调用它,请纠正我。我是MySQL Routines的新手。

  

CALL usp_GetUserValidation(' dev',@ ErrorCode)

这里有任何MySQL Routine专业人士可以启发我吗?提前谢谢你们:)

DELIMITER $$
CREATE PROCEDURE usp_GetUserValidation(IN `@Username` VARCHAR(255), OUT `@ErrorCode` INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT 'To validate user login'
BEGIN

    IF EXISTS
    (SELECT UserID 
        FROM mt_User
        WHERE UserName = @Username)
    THEN
            SET @ErrorCode = -1;


    ELSE
        SET @ErrorCode =  1;

    END IF;


    SELECT @ErrorCode AS res;

END$$
DELIMITER ;

1 个答案:

答案 0 :(得分:1)

这只是参数的命名约定。它很挑剔,不喜欢用户变量@标志。

您只是测试我可以看到,因为您返回的结果集包含info和OUT变量。

drop procedure if exists usp_GetUserValidation;
DELIMITER $$
CREATE PROCEDURE usp_GetUserValidation(IN pUsername VARCHAR(255), OUT pErrorCode INT)
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT 'To validate user login'
BEGIN

    IF EXISTS
    (SELECT UserID 
        FROM mt_User
        WHERE UserName = pUsername)
    THEN
            SET pErrorCode = -1;
    ELSE
        SET pErrorCode =  1;
    END IF;


    SELECT pErrorCode AS res;

END$$
DELIMITER ;

<强>架构:

-- drop table if exists mt_user;
create table mt_User 
(   UserID int auto_increment primary key,
    UserName varchar(100) not null,
    unique key(UserName)
);

insert mt_User(UserName) values ('dev');
select * from mt_User;

<强>测试

set @var1:=-4;
call usp_GetUserValidation('dev',@var1);
-- returns (-1) ---- Yea, we like that
select @var1;
-- (-1)

set @var1:=-4;
call usp_GetUserValidation('dev222',@var1);
-- returns 1 ---- Yea, we like that
select @var1;
-- 1