【问题标题】:MySQL Stored Procedure - IF EXISTS ... THEN returning unexpected resultMySQL 存储过程 - IF EXISTS ... THEN 返回意外结果
【发布时间】:2016-10-28 16:49:05
【问题描述】:

以下是我的存储过程(例程),用于检查数据库中是否存在 具有 Username(input) 的用户。 在数据库中,我已经有一个用户名为“dev”的用户。 然而,当我运行下面的例程时,它返回了 res = 1,我 预计它是 -1

我以这种方式调用了例程。如果我以错误的方式称呼它,请也纠正我。我对 MySQL 例程真的很陌生。

调用 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 ;

【问题讨论】:

    标签: mysql stored-procedures mysql-routines


    【解决方案1】:

    这只是您对参数的命名约定。它很挑剔,不喜欢用户变量@ 登录它们。

    您只是在测试我可以看到,因为您返回的结果集包含信息和 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 2012-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      相关资源
      最近更新 更多