具有可空参数的MYSQL存储过程,如果为null,则设置该参数

时间:2016-03-29 16:23:27

标签: mysql

您好我正在尝试在sproc中有一个'可选'参数,我知道在MYSQL中不允许这样做但我打算将它传递给null然后检查并设置它是否为null。但是我认为我的语法已经出来了,我怀疑我的分隔符有些东西,但我不明白为什么它是错的。

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `addSensorReading`(
      _temp DECIMAL(5,2), 
      _mois DECIMAL(5,2), 
      sourceName varchar(15), 
      _ambTemp DECIMAL(5,2), 
      _ambMois DECIMAL(5,2)
      )

IF (_ambTemp IS NULL) THEN
    SET _ambTemp := (   SELECT      r.ambTempValue
                        FROM        Readings r
                        WHERE       r.ambTempValue IS NOT NULL
                        ORDER BY    r.creation_time DESC
                        LIMIT       1);
END IF;

IF (_ambMois IS NULL) THEN
    SET _ambMois := (   SELECT      r.ambMoisValue
                        FROM        Readings r
                        WHERE       r.ambMoisValue IS NOT NULL
                        ORDER BY    r.creation_time DESC
                        LIMIT       1);
END IF;


INSERT INTO reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue)
    VALUES (_mois, _temp, sourceName, _ambTemp, _ambMois);;


DELIMITER ;
巴马尔给出了答案:

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `addSensorReading`(
      _temp DECIMAL(5,2), 
      _mois DECIMAL(5,2), 
      sourceName varchar(15), 
      _ambTemp DECIMAL(5,2), 
      _ambMois DECIMAL(5,2)
      )
BEGIN
/*we only get ambient readings from the api every 2 hours (that's how often it updates), so for ease of UI and readability we assume it has not changed as there is no more recent reading. So we get the latest reading with an ambient value if we don't have one provided. */
INSERT INTO Reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue)
SELECT _mois, _temp, sourceName, IFNULL(_ambTemp, r1.ambTempValue), IFNULL(_ambMois, r2.ambMoisValue)
FROM (SELECT ambTempValue
        FROM Reading
        WHERE ambTempValue IS NOT NULL
        ORDER BY creation_time DESC
        LIMIT 1) AS r1
CROSS JOIN
     (SELECT ambMoisValue
        FROM Reading
        WHERE ambTempValue IS NOT NULL
        ORDER BY creation_time DESC
        LIMIT 1) AS r2

END;

DELIMITER ;

导致错误:'查询为空'

提前道歉我对SQL服务器更熟悉,它似乎更擅长局部变量和spocs。 感谢

2 个答案:

答案 0 :(得分:1)

BEGINEND在Transact-SQL中是可选的,而在其他版本的SQL中是不可选的。

DELIMITER ;;
CREATE DEFINER=`root`@`localhost` 
PROCEDURE `addSensorReading`(
      _temp DECIMAL(5,2), 
      _mois DECIMAL(5,2), 
      sourceName varchar(15), 
      _ambTemp DECIMAL(5,2), 
      _ambMois DECIMAL(5,2)
      )
BEGIN    
IF (_ambTemp IS NULL) THEN
    SET _ambTemp := (   SELECT      r.ambTempValue
                        FROM        Readings r
                        WHERE       r.ambTempValue IS NOT NULL
                        ORDER BY    r.creation_time DESC
                        LIMIT       1);
END IF;

IF (_ambMois IS NULL) THEN
    SET _ambMois := (   SELECT      r.ambMoisValue
                        FROM        Readings r
                        WHERE       r.ambMoisValue IS NOT NULL
                        ORDER BY    r.creation_time DESC
                        LIMIT       1);
END IF;


INSERT INTO reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue)
    VALUES (_mois, _temp, sourceName, _ambTemp, _ambMois);
END;

DELIMITER ;

答案 1 :(得分:0)

尝试将所有内容组合到一个INSERT查询中。

INSERT INTO reading (moisValue, tempValue, sourceName, ambTempValue, ambMoisValue)
SELECT _mois, _temp, sourceName, IFNULL(_ambTemp, r1.ambTempValue), IFNULL(_ambMois, r2.ambMoisValue)
FROM (SELECT ambTempValue
        FROM Reading
        WHERE ambTempValue IS NOT NULL
        ORDER BY creation_time DESC
        LIMIT 1) AS r1
CROSS JOIN
     (SELECT ambMoisValue
        FROM Reading
        WHERE ambTempValue IS NOT NULL
        ORDER BY creation_time DESC
        LIMIT 1) AS r2
相关问题