文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Mysql 游标的简单使用方法

2019-10-02 12:59

关注

Mysql 游标的简单使用方法

一、游标简介

1、游标简介

游标是一个存储在MySQL服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集。有了游标可以方便的对该结果集进行逐行处理。 游标的设计是一种数据缓冲区的思想,用来存放SQL语句执行的结果。游标是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。
尽管游标能遍历结果中的所有行,但一次只指向一行。

2、游标的特性

游标具有三个属性:
A、不敏感(Asensitive):数据库可以选择不复制结果集
B、只读(Read only)
C、不滚动(Nonscrollable):游标只能向一个方向前进,并且不可以跳过任何一行数据。

3、游标的优点

游标是针对行操作的,对从数据库中SELECT查询得到的结果集的每一行可以进行分开的独立的相同或不同的操作,是一种分离的思想。游标是面向集合与面向行的设计思想之间的一种桥梁。

4、游标的缺点

游标的主要缺点是性能不高。
游标的开销与游标中进行的操作相关,如果在游标中进行复杂的操作,开销会非常高。如果采用面向集合的SQL语句,扫描成本为O(N);但如果采用面向集合的SQL语句的扫描成本为O(N*N),则使用游标有可能会带来性能上的提升。
游标的缺点是只能一行一行操作。在数据量大的情况下,速度过慢。数据库大部分是面对集合的,业务会比较复杂,而游标使用会有死锁,影响其他的业务操作,不可取。 当数据量大时,使用游标会造成内存不足现象。
它的作用就是用于对查询数据库所返回的记录进行遍历,以便进行相应的操作。

5、游标的适用场景

MySQL数据库中,可以在存储过程、函数、触发器、事件中使用游标。

二、游标的操作

1、游标的定义


DECLARE cursor_name CURSOR FOR select_statement

2、打开游标


OPEN cursor_name;

3、取游标中的数据


FETCH cursor_name INTO var_name [, var_name]...

4、关闭游标


CLOSE cursor_name;

5、释放游标


DEALLOCATE cursor_name;

三、游标实例

1、创建一张游标的测试表


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循环


DELIMITER $$ -- mysql默认结束符为;这里选择修改结束符为$$
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 sage = 0;  
    SET total=0;
    #打开游标  
    OPEN cur;  
    #开始循环游标里的数据  
    read_loop:LOOP  
    #根据游标当前指向的一条数据  
    FETCH cur INTO sid,sname,sage;  
    #判断游标的循环是否结束  
    IF done THEN  
        LEAVE read_loop;    #跳出游标循环  
    END IF;  
    #获取一条数据时,将count值进行累加操作,这里可以做任意你想做的操作,  
    SET total = total + 1;  
    #结束游标循环  
    END LOOP;  
    #关闭游标  
    CLOSE cur;  

    #输出结果  
    SELECT total;  
END$$ -- 存储过程结束
DELIMITER ;-- 重新定义结束符为默认的;

#调用存储过程  
call getTotal();  

结果显示


3

3、While循环


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  
        SET total = total + 1;  
        FETCH cur INTO sid, sname, sage;  
    END WHILE;  

    CLOSE cur;  
    SELECT total;  
END

4、Repeat循环


CREATE 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;  
    REPEAT  
    FETCH cur INTO sid, sname, sage;   
    IF NOT done THEN  
        SET total = total + 1;  
    END IF;  
    UNTIL done END REPEAT;  
    CLOSE cur;  
    SELECT total;  
END

5、使用游标数据

第一个例子从游标中检索第一行:


create procedure processorders()
begin
	declare o int;
	
	declare ordernumbers cursor
	for
	select order_num from orders;
	
	open ordernumbers;
	-- 利用fetch检索出第一行的order_num存储到一个名为o的局部变量中。
	fetch ordernumbers into o;
	close ordernumbers;
end;

第二个例子检索游标中的所有行,从第一行到最后一行:


create procedure processorders()
begin
	declare done boolean default 0;
	declare o int;
	
	declare ordernumbers cursor
	for
	select order_num from orders;
	
	
	declare continue handler for sqlstate "02000" set done = 1;
	
	open ordernumbers;
	-- 当done为真(非零)时结束循环。
	repeat
		fetch ordernumbers into o;
	until done end repeat;
	close ordernumbers;
end;

第三个例子对从游标中取出的数据进行某种实际的处理


create procedure processorders()
begin
	declare done boolean default 0;
	declare o int;
	declare t decimal(8,2);
	
	declare ordernumbers cursor
	for
	select order_num from orders;
	
	declare continue handler for sqlstate "02000" set done = 1;
	
	-- 创建一个表用来存放结果
	create table if not exists ordertotals
		(order_num int, total decimal(8,2));
		
	open ordernumbers;
	repeat
		fetch ordernumbers into o;
		-- ordertotal为在上一章创建的一个用来计算带税合计的存储过程
		call ordertotal(o, 1, t);
		insert into ordertotals(order_num, total)
		values(o, t);
	until done end repeat;
	close ordernumbers;
end;
-- 此存储过程不返回数据,但它能创建和填充另一个表。

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     801人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     348人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     311人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     432人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     220人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯