如果想看更多有关于MySQL数据库的文章,请跳转到MySQL自学目录
本节讲述游标的基本概念和用法
游标
游标本质上是一种能从select结果集中每次提取一条记录的机制。游标的作用就是用于对查询数据库所返回的记录进行遍历(一次只能指向一行),以便进行相应的操作。
游标的使用
游标的使用分为四个步骤:
- 声明游标。语法格式:declare 游标名 cursor for select语句;
- 打开游标。语法格式:open 游标名;
- 从游标中提取数据。语法格式:fetch 游标名 into 变量名1,变量名2…;
- 关闭游标。语法格式:close 游标名;
注意:从游标名中提取数据时,变量名的个数必须与声明游标时使用的select语句中结果集的字段个数保持一致。故在之前就应该定义好变量。
举个栗子,大家好好理解一下。
mysql> # 使用游标
mysql> # 在goods表中水果小于10斤的就进货10斤,大于10斤就进货5斤
mysql> delimiter $
mysql> select * from goods$
+--------+------+------+
| name | id | num |
+--------+------+------+
| 苹果 | 1 | 9 |
| 香蕉 | 2 | 5 |
| 西瓜 | 3 | 15 |
+--------+------+------+
3 rows in set (0.00 sec)
mysql> create procedure jinhuo2 ()
-> modifies sql data
-> begin
-> declare anum int;
-> declare aid int;
-> declare done int default false;
-> # 定义游标
-> declare num_cursor cursor for select id,num from goods;
-> #指定游标循环结束时的返回值
-> declare continue handler for not found set done = true;
-> # 打开游标
-> open num_cursor;
-> # 从游标中提取数据
-> fetch num_cursor into aid,anum;
-> while(not done) do
-> if (anum <= 10) then set anum = anum + 10;
-> else set anum = anum + 5;
-> end if;
-> select anum;
-> update goods set num = anum where id =aid;
-> fetch num_cursor into aid,anum;
-> end while;
-> # 关闭游标
-> close num_cursor;
-> end$
Query OK, 0 rows affected (0.00 sec)
mysql> select * from goods $
+--------+------+------+
| name | id | num |
+--------+------+------+
| 苹果 | 1 | 19 |
| 香蕉 | 2 | 15 |
| 西瓜 | 3 | 20 |
+--------+------+------+
3 rows in set (0.00 sec)
tips
- 不像多数DBMS,MySQL游标只能用于存储过程和函数。
- 隐含关闭。如果你不明确关闭游标,MySQL将会在到达end语句时自动关闭它。
- declare语句的次序。declare语句的发布存在特定的次序。用declare语句定义的局部变量必须在定义任意游标或句柄之前定义,而句柄必须在游标之后定义。