我在以下存储过程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 ;
一般来说,整个程序是如何工作的,以及它的用途。 感谢。
答案 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开发人员会将它们用于棘手的情况。