12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
mysql数据库 时间:2024-12-25 09:56:16
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
MySQL数据库高级(九)——游标一、游标简介1、游标简介游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
尽管游标能遍历结果中的所有行,但一次只指向一行。
游标的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。
游标具有三个属性:
A、不敏感(Asensitive):数据库可以选择不复制结果集
B、只读(Read only)
C、不滚动(Nonscrollable):游标只能向一个方向前进,并且不可以跳过任何一行数据。
游标是针对行操作的,对从数据库中SELECT查询得到的结果集的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。游标是面向集合与面向行的设计思想之间的一种桥梁。
4、游标的缺点游标的主要缺点是性能不高。
游标的开销与游标中进行的操作相关,如果在游标中进行复杂的操作,开销会非常高。如果采用面向集合的SQL语句,扫描成本为O(N);但如果采用面向集合的SQL语句的扫描成本为O(N*N),则使用游标有可能会带来性能上的提升。
游标的缺点是只能一行一行操作。在数据量大的情况下,速度过慢。数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,不可取。 当数据量大时,使用游标会造成内存不足现象。
MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。
二、游标的操作1、游标的定义DECLARE cursor_name CURSOR FOR select_statement
OPEN cursor_name;
FETCH cursor_name INTO var_name [, var_name]...
CLOSE cursor_name;
DEALLOCATE cursor_name;
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);
使用三种方式使用游标创建一个存储过程,统计年龄大于30的记录的数量。
2、Loop循环CREATEPROCEDURE getTotal()BEGINDECLARE 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 sage = 0;SET total=0;#打开游标OPEN cur;#开始循环游标里的数据read_loop:loop#根据游标当前指向的一条数据FETCH cur INTO sid,sname,sage;#判断游标的循环是否结束IF done THENLEAVE read_loop;#跳出游标循环END IF;#获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,SET total = total + 1;#结束游标循环END LOOP;#关闭游标CLOSE cur;#输出结果SELECT total;END
#调用存储过程call getTotal();
3、While循环CREATEPROCEDURE getTotal()BEGINDECLARE 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) DOSET total = total + 1;FETCH cur INTO sid, sname, sage;END WHILE;CLOSE cur;SELECT total;END
4、Repeat循环CREATE getTotal()BEGINDECLARE 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;REPEATFETCH cur INTO sid, sname, sage; IF NOT done THENSET total = total + 1;END IF;UNTIL done END REPEAT;CLOSE cur;SELECT total;END
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19