存储过程中的错误1064

时间:2016-09-20 03:06:30

标签: mysql

我在以下存储过程Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1; OPEN cur1; count' at line 13

中收到此错误
DELIMITER $$

DROP PROCEDURE IF EXISTS cursor_example
$$
CREATE PROCEDURE cursor_example()
   READS SQL DATA
BEGIN
   DECLARE i_Name CHAR(3);
   DECLARE i_SurfaceArea FLOAT(10,2);

   DECLARE done     INT DEFAULT 0;

   DECLARE cur1 CURSOR FOR
     SELECT Name, SurfaceArea
      FROM country

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

    OPEN cur1;
    country_loop:LOOP
        FETCH cur1 INTO i_Name, i_SurfaceArea;
        IF done=1 THEN
            LEAVE country_loop;
        END IF;
    END LOOP country_loop;
    CLOSE cur1;

END;
$$

DELIMITER ;

一般来说,整个程序是如何工作的,以及它的用途。 感谢。

1 个答案:

答案 0 :(得分:2)

FROM country后您错过了分号。使用以下模式:

DROP PROCEDURE IF EXISTS cursor_example;
DELIMITER $$
CREATE PROCEDURE cursor_example()
   READS SQL DATA
BEGIN
   DECLARE i_Name CHAR(3);
   DECLARE i_SurfaceArea FLOAT(10,2);

   DECLARE done     INT DEFAULT 0;

   DECLARE cur1 CURSOR FOR
     SELECT Name, SurfaceArea
      FROM country;

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;

    OPEN cur1;
    country_loop:LOOP
        FETCH cur1 INTO i_Name, i_SurfaceArea;
        IF done=1 THEN
            LEAVE country_loop;
        END IF;

        -- right here is where you do stuff with those variables

    END LOOP country_loop;
    CLOSE cur1;

END;
$$

DELIMITER ;
  

我不明白这个例子是尝试FETCH cur1 INTO   这个例子是为了什么?

请记住,CURSOR只是一个选择stmt。对于连接,它可能非常复杂,你可以命名。但最终它有一个选择列列表。在你的情况下它有2列回来。因此,FETCH,一次一行,将当前行带入LOCAL VARIABLES(按照从光标列表到列出的变量的相应顺序)。您在LOCAL VARIABLES s中声明了DECLARE

当你不在行时,HANDLER会将done设置为1,然后你就会退出循环。

至于DELIMITER阅读我的这个答案的后半部分Here

  

一般来说,整个程序是如何工作的,是什么   它适用于?

以上主要描述。游标用于程序处理返回的数据。允许您注入解决问题的程序性思维。顺便说一句,它们非常慢,应该尽可能避免。对于那些不熟悉SQL的开发人员来说,他们通常会成为一个无法理解如何处理集合和关系的人。也就是说,高性能RDBMS擅长的方式。

也就是说,有经验的SQL开发人员会将它们用于棘手的情况。