在存储过程中无法正常运行的MySQL情况

时间:2019-04-05 13:26:13

标签: mysql stored-procedures

这是一个存储过程,有3种可能的情况。我不知道如何使第三种情况下运行。如果我交换2和3,则3可以正常运行,而2则不能运行,这使我相信这不是每种情况下的实际代码。

CREATE DEFINER=`user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType int,IN _clientId varchar(45),IN _username varchar(50))
    BEGIN
        CASE WHEN _userType = 1
           THEN
              *do stuff that works*
        WHEN '2'
           THEN 
              *do other stuff that works*
        WHEN '3'
           THEN 
              {this won't run, but does if I swap it out with 2}
        ELSE BEGIN END;
        END CASE;
    END;

它不会给出错误,但是无论哪个代码位于3个位置的最后一个位置,它都不会执行任何操作(例如,将“ WHEN'3'”移到WHEN'2'的位置)是,然后2不会运行或出错)。

3 个答案:

答案 0 :(得分:1)

您将on the MySQL documentation中描述的两种可能的CASE WHEN语法混合在一起。您可以仅在CASE上使用变量来使用以下解决方案:

CREATE DEFINER = `user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType INT, IN _clientId VARCHAR(45), IN _username VARCHAR(50))
BEGIN
  CASE _userType
    WHEN 1 THEN
      -- do something
    WHEN 2 THEN 
      -- do something
    WHEN 3 THEN 
      -- do something
    ELSE
      BEGIN END;
  END CASE;
END;

...或以下在每个WHEN上使用变量的解决方案(而不是在CASE上使用一次):

CREATE DEFINER = `user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType INT, IN _clientId VARCHAR(45), IN _username VARCHAR(50))
BEGIN
  CASE
    WHEN _userType = 1 THEN
      -- do something
    WHEN _userType = 2 THEN 
      -- do something
    WHEN _userType = 3 THEN 
      -- do something
    ELSE 
      BEGIN END;
  END CASE;
END;

答案 1 :(得分:1)

使用完整的表达式:

CREATE DEFINER=`user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType int,IN _clientId varchar(45),IN _username varchar(50))
    BEGIN
        CASE WHEN _userType = 1
           THEN
              *do stuff that works*
        WHEN _userType = '2'
           THEN 
              *do other stuff that works*
        WHEN _userType  = '3'
           THEN 
              *do other stuff that works*
        ELSE BEGIN END;
        END CASE;
    END;

旁注:由于MYSQL中的'2'和'3'计算为TRUE,因此发生了您的情况。

答案 2 :(得分:1)

我只能说我能看到的代码,不是我看不到的代码,但是我发现您的代码有一些潜在的问题。首先,CASE表达式的每个谓词都应以定界符结尾。另外,如果您没有ELSE条件,则不要包含条件。所以我推荐这个版本:

CREATE DEFINER=`user`@`ip` PROCEDURE `api_userLogin_new`(IN _userType int,IN _clientId varchar(45),IN _username varchar(50))
    BEGIN
        CASE _userType WHEN 1
             THEN *do stuff that works*;
             WHEN 2
             THEN *do other stuff that works*;
             WHEN 3
             THEN {this won't run, but does if I swap it out with 2};
        END CASE;
    END;