代码之家  ›  专栏  ›  技术社区  ›  Aleix

错误代码:1064。您的SQL语法有错误;在2号线的“”附近

  •  0
  • Aleix  · 技术社区  · 3 年前

    有人知道错误在哪里吗?整个下午都在处理这件事。Workbench在指出错误方面不是很有用。

    这似乎是我代码中的下一个错误

    致电pCityMean(“西班牙”)错误代码:1064。您的SQL语法有错误;请查看与您的MariaDB服务器版本对应的手册,以了解第2行“”附近使用的正确语法。

    DELIMITER $$
    DROP PROCEDURE IF EXISTS pCityMean $$
    CREATE PROCEDURE pCityMean (IN vPais VARCHAR(30))
    BEGIN
        DECLARE done INT DEFAULT 0;
        DECLARE vID INT;
        DECLARE cur1 CURSOR FOR SELECT distinct id_city FROM world_temp_stats.temp_by_city where id_country=(SELECT id_country FROM world_temp_stats.country where Name=vPais);
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
        
        OPEN cur1;
             bucle1: LOOP
                FETCH cur1 INTO vID;
                IF done = 1 THEN
                    LEAVE bucle1;
                END IF;
                SET @nomCiutat = (SELECT name FROM world_temp_stats.city WHERE id = vID); 
                SET @tablaCiutat = CONCAT ("SELECT year(dt), count(AverageTemperature), ROUND(avg(AverageTemperature), 2) INTO OUTFILE '",UCASE(vPais),"_",UCASE(@nomCiutat),"_temp_analisis.csv' FIELDS TERMINATED BY ';'
                LINES TERMINATED BY '\n' FROM world_temp_stats.temp_by_city where id_country=(SELECT id_country FROM world_temp_stats.country where Name='",vPais,"' and id_city=",vID," group by year(dt)");
                PREPARE execucio FROM @tablaCiutat;
                EXECUTE execucio;
                DEALLOCATE PREPARE execucio;
             END LOOP bucle1;
        CLOSE cur1;
    
    END $$
    DELIMITER ;
    
    CALL pCityMean('Spain');
    
    1 回复  |  直到 3 年前
        1
  •  0
  •   Bill Karwin    3 年前

    我仔细看了你的问题,发现你忘了一个右括号。

    SET @tablaCiutat = CONCAT ("SELECT ... 
      where id_country=(
        SELECT id_country FROM world_temp_stats.country 
        where Name='",vPais,"' and id_city=",vID," group by year(dt)
    ");
    

    我觉得你搞混了是因为 year(dt) 以右括号结束,但还需要一个括号才能关闭子查询。如下所示:

    SET @tablaCiutat = CONCAT ("SELECT ... 
      where id_country=(
        SELECT id_country FROM world_temp_stats.country 
        where Name='",vPais,"' and id_city=",vID," group by year(dt)
      )
    ");
    

    在准备好的查询中,还应该为动态值使用查询参数,而不是字符串连接。

    但如果是我,我会改变很多关于这段代码的东西。为什么要用 INTO OUTFILE ,为什么要使用存储过程呢?根据我的经验,MySQL存储过程比用几乎任何客户机编程语言编写代码都要困难。我几乎从不使用MySQL存储过程。