MySQL 存储过程 - IF EXISTS ... THEN 返回意外结果
MySQL Stored Procedure - IF EXISTS ... THEN returning unexpected result
以下是我的存储过程(例程),用于检查数据库中是否存在具有用户名(输入) 的 用户。
在数据库中,我已经 有一个用户名 - 'dev'.
但是,当我 运行 下面的例程时,它返回 res = 1,我 期望它是 -1。
我是这样调用例程的。如果我用错误的方式称呼它,也请纠正我。我真的是 MySQL 例程的新手。
CALL usp_GetUserValidation ('dev', @ErrorCode)
这里的任何 MySQL 常规专业人士都可以启发我吗?提前谢谢你们:)
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 ;
这只是您对参数的命名约定。它很挑剔,不喜欢用户变量 @
在其中签名。
你只是在测试我可以看到,因为你返回了一个包含信息和 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
以下是我的存储过程(例程),用于检查数据库中是否存在具有用户名(输入) 的 用户。 在数据库中,我已经 有一个用户名 - 'dev'. 但是,当我 运行 下面的例程时,它返回 res = 1,我 期望它是 -1。
我是这样调用例程的。如果我用错误的方式称呼它,也请纠正我。我真的是 MySQL 例程的新手。
CALL usp_GetUserValidation ('dev', @ErrorCode)
这里的任何 MySQL 常规专业人士都可以启发我吗?提前谢谢你们:)
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 ;
这只是您对参数的命名约定。它很挑剔,不喜欢用户变量 @
在其中签名。
你只是在测试我可以看到,因为你返回了一个包含信息和 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