如果MySQL存储过程中的条件计算不正确

如果MySQL存储过程中的条件计算不正确,mysql,if-statement,stored-procedures,Mysql,If Statement,Stored Procedures,我已经用MySQL编写了下面提到的过程 CREATE DEFINER=`root`@`localhost` PROCEDURE `IsUploaderLoggedIn`( IN `inMobile` CHAR(10), IN `inSessionID` varchar(34) ) BEGIN DECLARE isLoggedIn TINYINT(1) DEFAULT 0; DECLARE uploaderType VARCHAR(10) DEFAULT ''; CALL GetUploaderT

我已经用MySQL编写了下面提到的过程

CREATE DEFINER=`root`@`localhost` PROCEDURE `IsUploaderLoggedIn`(
IN `inMobile` CHAR(10),
IN `inSessionID` varchar(34)
)
BEGIN
DECLARE isLoggedIn TINYINT(1) DEFAULT 0;
DECLARE uploaderType VARCHAR(10) DEFAULT '';
CALL GetUploaderType(inMobile, @x);
SELECT @x INTO uploaderType;
IF uploaderType = "surveyor" THEN
    SELECT Count(*) INTO isLoggedIn FROM surveyors WHERE Mobile = inMobile AND SessionID = inSessionID;
    SELECT "surveyor";
ELSE
    SELECT Count(*) INTO isLoggedIn FROM uploaders WHERE Mobile = inMobile AND SessionID = inSessionID;
    SELECT "uploader";
END IF;
SELECT isLoggedIn;
END;
Navicat中执行过程时,对于给定的
inMobile
inSessionID
,返回的值为:

结果1:用户类型|测量员

结果1(2):上传者|上传者

结果1(3):0或1(视情况而定)

式中,结果1(2)s的值应为测量师|测量师

下面是存储过程的定义
GetUploaderType

CREATE DEFINER=`root`@`localhost` PROCEDURE `GetUploaderType`(
IN `inMobile` CHAR(10),
OUT `Usertype` VARCHAR(8)
)
BEGIN
DECLARE usertype VARCHAR(8) DEFAULT '';
DECLARE userExists TINYINT DEFAULT 0;
/*SET officeExists = 0;*/
/* Check if mobile number belongs to a surveyor */
SELECT Count(*) INTO userExists FROM surveyors WHERE Mobile = inMobile;
IF userExists = 1 THEN
    SET usertype = 'surveyor';
ELSE
    /* If user is not surveyor, check for it in uploaders */
    SELECT Count(*) INTO userExists FROM uploaders WHERE Mobile = inMobile;
    IF userExists = 1 THEN
        SET usertype = 'uploader';
    END IF;
END IF;
SELECT usertype;
结束


我的脚本有什么问题吗?

GetUploaderType
中,您重新声明了变量
Usertype
,从而隐藏了同名的(不同的)
变量,请参见:

局部变量的作用域是BEGIN。。。在其中声明它的结束块。该变量可以在嵌套在声明块中的块中引用,但声明具有相同名称的变量的块除外


如果运行CALL GetUploaderType(inMobile,@x),会得到什么;使用您正在传递的值。过程
中变量
uploaderType
的值是uploaderLoggedin()
。表的
Mobile
字段是否唯一?如果不是的话,你可以跳过“测量员”,只要有多个测量员;您可以尝试使用
userExists 0
来避免这种情况。字段
Mobile
的值是唯一的,不能为空。顺便说一下,我注意到过程
GetUploaderType()
没有返回值in-OUT参数
Usertype
,从而导致过程
IsUploaderLoggedIn
中出现问题。因此,首先要修复过程
GetUploaderType()