无法在MySQL存储过程中正确评估条件

时间:2018-07-18 01:19:54

标签: mysql stored-procedures

我正在用MySQL编写存储过程,以便在数据库中创建新的城市名称(如果尚不存在)。

这是我的存储过程的脚本:

CREATE PROCEDURE `SaveCity` (
  IN `inStateID` varchar(2), 
  IN `inCityName` varchar(30),
  OUT `outCityID` varchar(3)
)
BEGIN
  DECLARE cityCode VARCHAR(3) DEFAULT 0;
  DECLARE maxCityID VARCHAR (3);
  /* Test whether CityName already exists */
  SELECT CityID INTO cityCode FROM cities WHERE StateID = inStateID AND CityName = inCityName;

  IF cityCode IS NULL THEN
      /* Fetch Max CityID */
      SELECT Max(CityID) INTO maxCityID FROM cities; 
      /* Increment CityID counter */
      SET cityCode = maxCityID + 1;
      INSERT INTO cities VALUES (cityCode, inStateID, inCityName);
  END IF;
  SET outCityID = cityCode;
  SELECT @outCityID;
END

如果我写条件IF cityCode IS NULL THEN,则对于inCityName是否存在的所有inStateID值,如果IF (cityCode IS NULL) THEN相同,它将评估为FALSE。

如果我写条件inCityName,则对SELECT Max(CityID) FROM cities;的所有值求值为TRUE。同样,如果条件评估为TRUE,则过程返回的值为 0 ,并且不会为不存在的城市创建新记录。

如果我在过程外执行查询{{1}},则它将为数据库中已经存在的城市名称返回CityID的绝对值。

请帮助。

1 个答案:

答案 0 :(得分:0)

尝试:

...
  -- DECLARE cityCode VARCHAR(3) DEFAULT 0;
  DECLARE cityCode VARCHAR(3); /* DEFAULT NULL */
...
  -- SELECT @outCityID;
  SELECT outCityID;
...

请参见dbfiddle