2016-09-20 71 views
-1

我在下面的存储过程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错误1064在存储过程中

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 ; 

得到这个错误,只是一般的整个过程是如何想的工作,什么是它。 谢谢。

+0

“正确的错误”是什么意思? – EJP

回答

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 ; 

我不与例如不解的是尝试提取CUR1 INTO在 的例子是?

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

当你不在行的时候,HANDLERdone设置为1,你退出循环。

至于DELIMITER阅读我的这个答案的最后一半Here

一般情况下,整个程序是如何工作的以及为什么是 ?

上面大部分描述。游标用于处理返回的数据。让你在解决问题时注入程序思维。顺便说一句,他们非常缓慢,应尽可能避免。它们通常是开发SQL的开发人员的一个拐杖,无法让他们了解如何使用集合和关系进行工作。也就是说,高性能RDBMS的表现非常出色。

这就是说,经验丰富的SQL开发人员已知使用它们的棘手的情况。

+0

分号修正错误,但现在发出以下命令:CALL cursor_example();什么都没发生。我看到你在END IF和END LOOP之间写的评论,这让我想到更多的语句会在这个存储过程中进一步使用CURSOR。 – Bhail

+1

你确实需要做一些事情,否则你只是设置变量。看看这个新手的小例子http://stackoverflow.com/a/39553173 – Drew

+1

你可以对'i_Name'和'i_SurfaceArea'进行单独的迭代,并对它们做些什么。但所有这一切都不明确,你的意图是什么。 – Drew