简体   繁体   English

MySQL存储过程-如果存在……则返回意外结果

[英]MySQL Stored Procedure - IF EXISTS … THEN returning unexpected result

The below is my Stored Procedure(Routine) to check whether or not a user with Username(input) exists in the database. 以下是我的存储过程(例程),用于检查数据库中是否存在具有Username(输入)的用户 Inside the database, I already have a user with Username - 'dev'. 在数据库内部,我已经有一个用户名-'dev'的用户。 However, when I ran the below routine, it returned me with res = 1 , which I expected it to be -1 . 但是,当我运行以下例程时,它返回res = 1 ,我希望它是-1

I called the routine this way. 我以这种方式调用了例程。 Please correct me too if I am calling it the wrong way. 如果我打错了电话,也请纠正我。 I am really new to MySQL Routines. 我真的是MySQL例程的新手。

CALL usp_GetUserValidation ('dev', @ErrorCode) 致电usp_GetUserValidation('dev',@ErrorCode)

Can any MySQL Routine pros here enlighten me on this? 这里的任何MySQL Routine专家都能启发我吗? Thank you in advance guys :) 预先谢谢你们:)

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 ;

It was simply your naming conventions for the parameters. 只是您对参数的命名约定。 It is finicky and does not like User Variable @ signs in them. 这很挑剔,并且不喜欢在其中输入用户变量@

You are just testing I can see, as you are returning both a resultset with the info and the OUT variable. 我所看到的只是测试,因为您同时返回了带有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 ;

Schema: 架构:

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

Test: 测试:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM