MySQL - 游标 DECLARE 语句



数据库中的游标是一种允许您迭代/遍历表记录的构造。在 MySQL 中,您可以在存储程序(例如过程、函数等)中使用游标。

换句话说,您可以使用游标从 MySQL 存储程序迭代表记录。MySQL 提供的游标是嵌入式游标。

  • 只读 - 使用这些游标,您无法更新任何表。

  • 不可滚动 - 使用这些游标,您可以从上到下在一个方向上从表中检索记录。

  • 不敏感 - 这些游标对表中所做的更改不敏感,即对表所做的修改不会反映在游标中。

    这意味着如果我们创建了一个包含表中所有记录的游标,并且与此同时如果我们向表中添加了更多记录,那么这些最近的更改将不会反映在我们先前获得的游标中。

在存储程序中声明游标时,您需要确保这些(游标声明)始终遵循变量和条件声明。

要使用游标,您需要按照以下步骤操作(按相同的顺序)

  • 使用 DECLARE 语句声明游标。
  • 声明变量和条件。
  • 使用 OPEN 语句打开已声明的游标。
  • 使用 FETCH 语句从表中检索所需记录。
  • 最后使用 CLOSE 语句关闭游标。
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 语句在 tutorials 表中插入 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)
);

以下过程使用游标将 tutorials 表的内容备份到备份表:

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 标题 作者 日期
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
广告
© . All rights reserved.