MySQL - 游标 DECLARE 语句
数据库中的游标是一种允许您迭代/遍历表记录的结构。在 MySQL 中,您可以在存储程序(例如过程、函数等)中使用游标。
换句话说,您可以使用游标在 MySQL 存储程序中迭代表的记录。MySQL 提供的游标是嵌入式游标。它们是 -
只读 - 使用这些游标,您无法更新任何表。
不可滚动 - 使用这些游标,您可以从一个方向(即从上到下)检索表中的记录。
不敏感 - 这些游标对表中所做的更改不敏感,即对表中所做的修改不会反映在游标中。
这意味着,如果我们创建了一个保存表中所有记录的游标,同时我们向该表中添加了更多记录,这些最近的更改将不会反映在我们之前获得的游标中。
在存储程序中声明游标时,您需要确保这些(游标声明)始终遵循变量和条件声明。
要使用游标,您需要按照以下步骤操作(顺序相同)
- 使用 DECLARE 语句声明游标。
- 声明变量和条件。
- 使用 OPEN 语句打开声明的游标。
- 使用 FETCH 语句从表中检索所需记录。
- 最后使用 CLOSE 语句关闭游标。

DECLARE 语句
使用 DECLARE 语句可以声明游标,并将其与 SELECT 语句关联,该语句从表中获取所需记录。与游标关联的 SELECT 语句不允许使用 INTO 子句。
声明游标后,您可以使用 FETCH 语句从中检索记录。您需要确保游标声明位于处理程序声明之前。您可以在单个存储程序中创建和使用游标。
语法
以下是 MySQL 游标 DECLARE 语句的语法 -
DECLARE cursor_name CURSOR FOR select_statement;
示例
假设我们已经使用 CREATE 语句在 MySQL 数据库中创建了一个名为 tutorials 的表,如下所示 -
CREATE TABLE tutorials ( ID INT PRIMARY KEY, TITLE VARCHAR(100), AUTHOR VARCHAR(40), DATE VARCHAR(40) );
现在,我们将使用 INSERT 语句在教程表中插入 5 条记录 -
Insert into tutorials values (1, 'Java', 'Krishna', '2019-09-01'), (2, 'JFreeCharts', 'Satish', '2019-05-01'), (3, 'JavaSprings', 'Amit', '2019-05-01'), (4, 'Android', 'Ram', '2019-03-01'), (5, 'Cassandra', 'Pruthvi', '2019-04-06');
让我们创建另一个表来备份数据 -
CREATE TABLE backup ( ID INT, TITLE VARCHAR(100), AUTHOR VARCHAR(40), DATE VARCHAR(40) );
以下步骤使用游标将教程表的内容备份到备份表 -
DELIMITER // CREATE PROCEDURE ExampleProc() BEGIN DECLARE done INT DEFAULT 0; DECLARE tutorialID INTEGER; DECLARE tutorialTitle, tutorialAuthor, tutorialDate VARCHAR(20); DECLARE cur CURSOR FOR SELECT * FROM tutorials; DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; OPEN cur; label: LOOP FETCH cur INTO tutorialID, tutorialTitle, tutorialAuthor, tutorialDate; INSERT INTO backup VALUES(tutorialID, tutorialTitle, tutorialAuthor, tutorialDate); IF done = 1 THEN LEAVE label; END IF; END LOOP; CLOSE cur; END// DELIMITER ;
您可以像下面这样调用上述过程 -
CALL ExampleProc;
如果您验证备份表的内容,您可以看到插入的记录,如下所示 -
select * from Backup;
输出
上述查询产生以下输出 -
ID | TITLE | AUTHOR | DATE |
---|---|---|---|
1 | Java | Krishna | 2019-09-01 |
2 | JFreeCharts | Satish | 2019-05-01 |
3 | JavaSprings | Amit | 2019-05-01 |
4 | Android | Ram | 2019-03-01 |
5 | Cassandra | Pruthvi | 2019-04-06 |