MySQL - 游标 OPEN 语句
数据库中的游标是一种允许您迭代/遍历表记录的结构。在 MySQL 中,您可以在存储程序(例如过程、函数等)中使用游标。
换句话说,您可以使用游标在 MySQL 存储程序中迭代表的记录。MySQL 提供的游标是嵌入式游标。它们是 -
只读 - 使用这些游标,您无法更新任何表。
不可滚动 - 使用这些游标,您可以从一个方向(即从上到下)检索表中的记录。
不敏感 - 这些游标对表中所做的更改不敏感,即对表中所做的修改不会反映在游标中。
这意味着,如果我们创建了一个保存表中所有记录的游标,同时我们向该表中添加了更多记录,这些最近的更改将不会反映在我们之前获得的游标中。
在存储程序中声明游标时,您需要确保这些(游标声明)始终遵循变量和条件声明。
要使用游标,您需要按照以下步骤操作(顺序相同)
- 使用 DECLARE 语句声明游标。
- 声明变量和条件。
- 使用 OPEN 语句打开声明的游标。
- 使用 FETCH 语句从表中检索所需记录。
- 最后使用 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 条记录。
将以下值插入到 dispatches 值中: ('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 查询生成以下输出:-
Product_Name | Name_Of_Customer | Month_Of_Dispatch | Price | Location |
---|---|---|---|---|
Key-Board | Raja | 2019-05-04 15:02:45 | 7000 | Hyderabad |
Earphones | Roja | 2019-06-26 14:13:12 | 2000 | Vishakhapatnam |
Mouse | Puja | 2019-12-07 07:50:37 | 3000 | Vijayawada |
Mobile | Vanaja | 2018-03-21 16:00:45 | 9000 | Chennai |
Headset | Jalaja | 2018-12-30 10:49:27 | 6000 | Goa |
以下查询创建一个检索 Product_Name 和位置的过程。在这里我们使用两个 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 |
---|
Headset, Headset, Mobile, Mouse, Earphones, Key-Board, |