MySQL, когда хранимая процедура не работает должным образом - PullRequest
0 голосов
/ 05 апреля 2019

Это хранимая процедура, которая имеет 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-х позиций (т. е. передвиньте «КОГДА« 3 »», и его код достигнет значения «КОГДА« 2 », а затем 2 не будет работать или возникла ошибка»).

Ответы [ 3 ]

1 голос
/ 05 апреля 2019

Используйте полное выражение:

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;

Примечание: ваш сценарий произошел, поскольку '2' и '3' оцениваются как TRUE в MYSQL.

1 голос
/ 05 апреля 2019

Я могу говорить только с кодом, который вижу, но не могу, но вижу несколько потенциальных проблем с вашим кодом. Во-первых, каждый предикат выражения 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;
1 голос
/ 05 апреля 2019

Вы смешали два возможных синтаксиса CASE WHEN, описанных в документации по MySQL .Вы можете использовать следующее решение, используя переменную только для 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...