您好我正在尝试在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。 感谢
答案 0 :(得分:1)
BEGIN
和END
在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