如果MySQL存储过程中的条件计算不正确
我已经用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
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()
。