在此位置删除无效,需要 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 通配符。您应该要求此程序输入的是完整的国家/地区名称。