MySQL修炼、游标 前言 实例

前言

要明白什么是游标,首先要了解存储过程,存储过程是事先经过编译并且存储在数据库中的一段SQL语句,他可以接受参数,也可以在其中使用IF语句、设置变量、循环等,比如下面语句用于创建一个存储过程。

1
2
sql复制代码delimiter $$
create procedure select_all() begin select * from user; end;$$

调用存储过程。

1
sql复制代码mysql>  call select_all;$$

存储过程可以减少数据库和应用服务器之间的传输,对提供数据库处理效率还是有好处的,而游标(Cursor)有的地方又叫光标,可以在存储过程中,对结果集进行循环处理,但是目前,MySQL只允许我们从SELECT语句从头到尾获取结果集中的每一行,无法从最后一行获取到第一行,也无法直接跳转到结果集中的指定行。

使用游标有以下几个步骤。

  1. 游标定义
1
sql复制代码DECLARE cursor_name CURSOR FOR select_statement
  1. 打开游标
1
sql复制代码OPEN cursor_name;
  1. 获取游标中的数据
1
sql复制代码FETCH cursor_name INTO var_name [, var_name]...

4.关闭光标

1
sql复制代码CLOSE cursor_name;
  1. 释放光标
1
sql复制代码DEALLOCATE cursor_name;

实例

创建表

1
2
3
4
5
6
7
8
9
10
sql复制代码CREATE TABLE cursor_table
(id INT ,name VARCHAR(10),age INT
)ENGINE=innoDB DEFAULT CHARSET=utf8;
insert into cursor_table values(1, '张三', 500);
insert into cursor_table values(2, '李四', 200);
insert into cursor_table values(3, '王五', 100);
insert into cursor_table values(4, '老六', 20);


create table cursor_table_user(name varchar(10));

下面我们通过游标,遍历cursor_table表,把年龄大于30的人名存放到cursor_table_user

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
sql复制代码drop procedure getTotal;
delete from cursor_table_user ;

CREATE PROCEDURE getTotal()
BEGIN
DECLARE total INT;
DECLARE sid INT;
DECLARE sname VARCHAR(10);
DECLARE sage INT;
DECLARE done INT DEFAULT false;
DECLARE cur CURSOR FOR SELECT id,name,age from cursor_table where age>30;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;
SET total = 0;
OPEN cur;
FETCH cur INTO sid, sname, sage;
WHILE(NOT done)
DO
insert cursor_table_user values(sname);
SET total = total + 1;
FETCH cur INTO sid, sname, sage;

END WHILE;
CLOSE cur;
SELECT total;
END
1
2
3
4
5
6
7
8
9
10
11
sql复制代码call getTotal();

mysql> select * from cursor_table_user;
+--------+
| name |
+--------+
| 张三 |
| 李四 |
| 王五 |
+--------+
3 rows in set (0.00 sec)

这段程序有一行非常重要,DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true; ,他表示如果游标或SELECT语句没有数据的时候,将done变量的值设置 为 true,用来退出循环。

下面就是通过WHILE来依次遍历。

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%