在此位置删除无效,需要 END。 MySQL
Delete is not valid at this position, expecting END. MySQL
我一直在处理一个过程中的错误,其中我声明游标的查询给出错误,它说我缺少一个 END,但我看到我的所有查询都关闭并在适当的位置地方。你看到我忘记了什么了吗?
DELIMITER $$
CREATE PROCEDURE pCityMean(IN vNameCountry VARCHAR(20))
BEGIN
DECLARE vid INT default 0;
DECLARE done INT DEFAULT 0;
SELECT id_country INTO @id_country From country WHERE name = CONCAT('"%',@vNameCountry,'%"');
DECLARE cur1 CURSOR FOR SELECT c.id FROM (city AS c JOIN temp_by_city AS tbc JOIN country AS co ON c.id = tbc.id_city AND tbc.id_country = co.id_country) WHERE co.id_country = @id_country GROUP BY c.name; -- This one
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1
OPEN cur1
bucle1:LOOP
FETCH cur1 INTO vid
if done = 1 THEN
leave bucle1;
SELECT YEAR(dt), COUNT(AverageTemperature),ROUND(AVG(AverageTemperature)) FROM temp_by_city
WHERE id_country = @id_country AND id_city = vid
GROUP BY YEAR(dt), vid;
END LOOP bucle1
CLOSE cur1
END $$
DELIMITER ;
您的程序中存在大量语法错误。这是我目前看到的:
- 所有 DECLARE 语句必须在所有其他语句之前(如上面@Luuk 的评论中所述)。
- 混淆
vNameCountry
和 @vNameCountry
。在 MySQL 中,这是两个独立的变量。
- 您的许多语句都缺少必要的分号终止。
IF
缺少所需的 END IF
。
GROUP BY
. 的使用无效
LIKE
通配符的使用无效。
除此之外,我认为在此过程中根本不需要游标。
作为单个查询,该过程会简单得多:
DELIMITER $$
CREATE PROCEDURE pCityMean(IN vNameCountry VARCHAR(20))
BEGIN
SELECT tbc.id_city,
YEAR(tbc.dt) AS `year`,
COUNT(*) AS count,
ROUND(AVG(tbc.AverageTemperature)) AS avg_temp
FROM temp_by_city AS tbc
JOIN country AS co ON tbc.id_country = co.id_country
WHERE co.name = vNameCountry
GROUP BY tbc.id_city, YEAR(tbc.dt);
END$$
DELIMITER ;
我知道上述程序会产生与您不同的结果。您编写的过程会产生多个结果集,每个城市一个。但是您的结果集不会识别哪个结果集对应哪个城市,因为 id_city
不是任何结果中的列。
我还消除了 LIKE
通配符。您应该要求此程序输入的是完整的国家/地区名称。
我一直在处理一个过程中的错误,其中我声明游标的查询给出错误,它说我缺少一个 END,但我看到我的所有查询都关闭并在适当的位置地方。你看到我忘记了什么了吗?
DELIMITER $$
CREATE PROCEDURE pCityMean(IN vNameCountry VARCHAR(20))
BEGIN
DECLARE vid INT default 0;
DECLARE done INT DEFAULT 0;
SELECT id_country INTO @id_country From country WHERE name = CONCAT('"%',@vNameCountry,'%"');
DECLARE cur1 CURSOR FOR SELECT c.id FROM (city AS c JOIN temp_by_city AS tbc JOIN country AS co ON c.id = tbc.id_city AND tbc.id_country = co.id_country) WHERE co.id_country = @id_country GROUP BY c.name; -- This one
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1
OPEN cur1
bucle1:LOOP
FETCH cur1 INTO vid
if done = 1 THEN
leave bucle1;
SELECT YEAR(dt), COUNT(AverageTemperature),ROUND(AVG(AverageTemperature)) FROM temp_by_city
WHERE id_country = @id_country AND id_city = vid
GROUP BY YEAR(dt), vid;
END LOOP bucle1
CLOSE cur1
END $$
DELIMITER ;
您的程序中存在大量语法错误。这是我目前看到的:
- 所有 DECLARE 语句必须在所有其他语句之前(如上面@Luuk 的评论中所述)。
- 混淆
vNameCountry
和@vNameCountry
。在 MySQL 中,这是两个独立的变量。 - 您的许多语句都缺少必要的分号终止。
IF
缺少所需的END IF
。GROUP BY
. 的使用无效
LIKE
通配符的使用无效。
除此之外,我认为在此过程中根本不需要游标。
作为单个查询,该过程会简单得多:
DELIMITER $$
CREATE PROCEDURE pCityMean(IN vNameCountry VARCHAR(20))
BEGIN
SELECT tbc.id_city,
YEAR(tbc.dt) AS `year`,
COUNT(*) AS count,
ROUND(AVG(tbc.AverageTemperature)) AS avg_temp
FROM temp_by_city AS tbc
JOIN country AS co ON tbc.id_country = co.id_country
WHERE co.name = vNameCountry
GROUP BY tbc.id_city, YEAR(tbc.dt);
END$$
DELIMITER ;
我知道上述程序会产生与您不同的结果。您编写的过程会产生多个结果集,每个城市一个。但是您的结果集不会识别哪个结果集对应哪个城市,因为 id_city
不是任何结果中的列。
我还消除了 LIKE
通配符。您应该要求此程序输入的是完整的国家/地区名称。