MySQL - 游标 OPEN 语句



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

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

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

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

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

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

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

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

  • 使用 DECLARE 语句声明游标。
  • 声明变量和条件。
  • 使用 OPEN 语句打开已声明的游标。
  • 使用 FETCH 语句从表中检索所需的记录。
  • 最后使用 CLOSE 语句关闭游标。
CLOSE

游标 OPEN 语句

此语句用于打开前面声明的游标。OPEN 语句初始化游标的结果集,因此我们必须在从结果集中提取行之前调用 OPEN 语句。

语法

以下是 MySQL 游标 OPEN 语句的语法:

OPEN cursor_name;

示例

假设我们创建了一个名为 dispatches 的表,如下所示:

CREATE TABLE Dispatches( Product_Name VARCHAR(255), 
Name_Of_Customer VARCHAR(255), Month_Of_Dispatch VARCHAR(255), 
Price INT, Location VARCHAR(255));

让我们使用 INSERT 语句向其中插入 5 条记录。

Insert into dispatches values
('Key-Board', 'Raja', TIMESTAMP('2019-05-04', '15:02:45'), 7000, 
'Hyderabad'),
('Earphones', 'Roja', TIMESTAMP('2019-06-26', '14:13:12'), 2000, 
'Vishakhapatnam'),
('Mouse', 'Puja', TIMESTAMP('2019-12-07', '07:50:37'), 3000, 
'Vijayawada'),
('Mobile', 'Vanaja' , TIMESTAMP ('2018-03-21', '16:00:45'), 9000, 
'Chennai'),
('Headset', 'Jalaja' , TIMESTAMP('2018-12-30', '10:49:27'), 6000, 
'Goa');

如果您验证上面创建的表的内容,您可以观察到插入的记录如下:

SELECT * FROM Dispatches;

输出

上面的 mysql 查询生成以下输出:

产品名称 客户姓名 发货月份 价格 地点
键盘 Raja 2019-05-04 15:02:45 7000 海德拉巴
耳机 Roja 2019-06-26 14:13:12 2000 维沙卡帕特南
鼠标 Puja 2019-12-07 07:50:37 3000 维杰亚瓦达
手机 Vanaja 2018-03-21 16:00:45 9000 钦奈
耳机 Jalaja 2018-12-30 10:49:27 6000 果阿

下面的查询创建一个存储过程,该过程检索 Product_Name 和 location。在这里,我们使用两个 OUT 参数来存储这些值:

DELIMITER //
Create procedure cursorExample (INOUT list VARCHAR(5000))
   BEGIN
      DECLARE val INT DEFAULT FALSE;
      DECLARE prodName VARCHAR(150) DEFAULT "";
      DECLARE cur CURSOR FOR SELECT Product_Name FROM Dispatches;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET val = TRUE;
      OPEN cur;
         REPEAT
            FETCH cur INTO prodName;
            SET list = CONCAT(prodName, ", ", list);
            UNTIL val = 1
         END REPEAT;
      CLOSE cur;
      END //
DELIMITER ;

您需要通过传递一个变量来调用此过程,并且可以使用 SELECT 语句从中检索值。

SET @products="";
CALL cursorExample(@products);
SELECT @products;

输出

以下是上述查询的输出:

@products
耳机, 耳机, 手机, 鼠标, 耳机, 键盘,
广告
© . All rights reserved.