MYSQL 游标学习及使用实例「建议收藏」

MYSQL 游标学习及使用实例「建议收藏」who?(游标是什么?)游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果。每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言

who?(游标是什么?)
游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果。每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言进一步处理;
个人理解:感觉游标和指针相似,指定结果集后一行行执行;

 

why?(为什么要学习游标)
游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;
它还提供对基于游标位置而对表中数据进行删除或更新的能力;
而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

 

what?(游标的生命周期)
–1.声明游标

–2.打开游标

–3.声明游标提取数据所要存放的变量

–4.定位游标到哪一行

 

使用实例

1、搭配while循环语句使用

# 代码使用目的:update t_shop表中的数据

BEGIN
-- 声明游标存储的变量 DECLARE v_shop_name varchar(255); DECLARE v_shop_area varchar(32); DECLARE done int DEFAULT 0; DECLARE chang_cursor CURSOR for select shop_name,shop_area from t_shop ; -- 游标中内容为空时设置为1 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; -- 打开游标 OPEN chang_cursor; while done = 0 do -- 将游标赋值给对应变量 FETCH chang_cursor into v_shop_name,v_shop_area; if v_shop_name = "冰箱旗舰店" THEN update t_shop set shop_area = "广东深圳" where shop_name = v_shop_name; END IF; end WHILE; -- 关闭游标 close chang_cursor; END

代码100分

2、与loop循环语句使用

代码100分## 代码目的:统计t_shop表中的数据条数

BEGIN
DECLARE done int DEFAULT 0; DECLARE v_shop_id VARCHAR(32); DECLARE total int DEFAULT 0; DECLARE v_shop_name VARCHAR(255); -- 定义游标 DECLARE count_rnt CURSOR for select shop_id,shop_name from t_shop; -- 设定not found时done数据变化,FETCH获取指向的数据行,并把指针指向下一行,如何已经是最后一行那就会造成游标溢出,从而引发mysql预定义的not found错误,所以可以通过设置变量让溢出时结束 DECLARE CONTINUE HANDLER FOR NOT found set done = 1; -- 打开游标 open count_rnt; -- 设置循环条件 read_loop:loop FETCH count_rnt into v_shop_id,v_shop_name ; if done = 1 THEN leave read_loop; end IF; SET total = total + 1; end LOOP; -- 关闭游标 CLOSE count_rnt; -- 输出结果 select total; END

3、与repeat循环语句使用



BEGIN
DECLARE v_shop_id VARCHAR(30); DECLARE v_shop_name varchar(255); DECLARE done int default 0; DECLARE v_total int DEFAULT 0; -- 定义游标 DECLARE count_rnt1 CURSOR for select shop_id,shop_name from t_shop where shop_name regexp "美的"; -- 定义游标溢出的 DECLARE CONTINUE HANDLER FOR NOT found set done = 1; -- 打开游标 open count_rnt1; -- 循环语句 REPEAT FETCH count_rnt1 into v_shop_id,v_shop_name; if done = 0 THEN set v_total = v_total + 1; end if ; UNTIL done = 1 end repeat; -- 关闭游戏 CLOSE count_rnt1; select v_total; END

 

 

 

备注:相关知识
种类
MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API服务器游标和客户游标。
(1)Transact_SQL 游标
  Transact_SQL 游标是由DECLARE CURSOR 语法定义、主要用在Transact_SQL脚本、存储过程和触发器中。Transact_SQL 游标主要用在服务器上,由从客户端发送给服务器的Transact_SQL 语句或是批处理、存储过程、触发器中的Transact_SQL 进行管理。 Transact_SQL 游标不支持提取数据块或多行数据。
(2)API游标
  API 游标支持在OLE DB, ODBC 以及DB_library 中使用游标函数,主要用在服务器上。每一次客户端应用程序调用API 游标函数,MS SQL SEVER 的OLE DB 提供者、ODBC驱动器或DB_library 的动态链接库(DLL) 都会将这些客户请求传送给服务器以对API游标进行处理。
(3)客户游标
  客户游标主要是当在客户机上缓存结果集时才使用。在客户游标中,有一个缺省的结果集被用来在客户机上缓存整个结果集。客户游标仅支持静态游标而非动态游标。由于服务器游标并不支持所有的Transact-SQL语句或批处理,所以客户游标常常仅被用作服务器游标的辅助。因为在一般情况下,服务器游标能支持绝大多数的游标操作。由于API 游标和Transact-SQL 游标使用在服务器端,所以被称为服务器游标,也被称为后台游标,而客户端游标被称为前台游标。在本章中我们主要讲述服务器(后台)游标。

游标的分类
  根据游标检测结果集变化的能力和消耗资源的情况不同,SQL Server支持的API服务器游标分为一下4种:

静态游标 : 静态游标的结果集,在游标打开的时候建立在TempDB中,不论你在操作游标的时候,如何操作数据库,游标中的数据集都不会变。例如你在游标打开的时候,对游标查询的数据表数据进行增删改,操作之后,静态游标中select的数据依旧显示的为没有操作之前的数据。如果想与操作之后的数据一致,则重新关闭打开游标即可。
动态游标 : 这个则与静态游标相对,滚动游标时,动态游标反应结果集中的所有更改。结果集中的行数据值、顺序和成员在每次提取时都会变化。所有用户做的增删改语句通过游标均可见。如果使用API函数或T-SQL Where Current of子句通过游标进行更新,他们将立即可见。在游标外部所做的更新直到提交时才可见。
只进游标:只进游标不支持滚动,只支持从头到尾顺序提取数据,数据库执行增删改,在提取时是可见的,但由于该游标只能进不能向后滚动,所以在行提取后对行做增删改是不可见的。
键集驱动游标:打开键集驱动游标时,该有表中的各个成员身份和顺序是固定的。打开游标时,结果集这些行数据被一组唯一标识符标识,被标识的列做删改时,用户滚动游标是可见的,如果没被标识的列增该,则不可见,比如insert一条数据,是不可见的,若可见,须关闭重新打开游标。 静态游标在滚动时检测不到表数据变化,但消耗的资源相对很少。动态游标在滚动时能检测到所有表数据变化,但消耗的资源却较多。键集驱动游标则处于他们中间,所以根据需求建立适合自己的游标,避免资源浪费。

参考:https://blog.csdn.net/xiansheng0813/article/details/91322716

https://www.cnblogs.com/cjm123/p/8619942.html

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/10557.html

(0)
上一篇 2022-12-25
下一篇 2022-12-25

相关推荐

  • 再谈mvcc与vacuum[亲测有效]

    再谈mvcc与vacuum[亲测有效]再谈mvcc与vacuum 1简介 在pg的各种技术讨论和日常运维中,vacuum永远是主要的话题之一。 pg数据库管理运维过程中,经常会调整以下的vacuum参数,以优化数据库的性能 alter …

    2023-02-22
    135
  • centos安装redis4.0教程_为什么要使用redis

    centos安装redis4.0教程_为什么要使用redis一、CentOS 7.9 安装 redis-6.2.0 1 下载地址:https://download.redis.io/releases/redis-6.2.0.tar.gz 2 安装gcc来进行编

    2023-06-08
    134
  • cbbe3bbb安装_B&O软件

    cbbe3bbb安装_B&O软件在目前我接触过的轻量级BI工具中,我最喜欢的是MS Power BI。 如果只是个人使用,我觉得这简直是一个完美的工具了。但是,凡事就怕但是,在企业级应用中,当前版本的Power BI有几个不太方便的地方。对我而言,最不能忍的一点就是数据需要完全导入到PBI文件之后才能使用(官…

    2023-03-02
    134
  • 使用Python中的randrange为您的程序添加随机性和灵活性

    使用Python中的randrange为您的程序添加随机性和灵活性Python中的randrange函数是生成随机整数的重要函数之一。它可以使程序变得更加灵活且充满随机性。randrange函数可以在指定的范围内随机生成一个整数。可以指定开始和结束数字,步长也可以被指定。

    2024-02-15
    93
  • 用Python实现精确求解平方根

    用Python实现精确求解平方根在程序中,如果需要精确计算平方根,我们需要先了解关于平方根的一些数学知识。对于正数x,它的平方根可以表示为下面的公式:

    2023-12-08
    108
  • 转:Oracle认证考券延期声明

    转:Oracle认证考券延期声明致广大Oracle认证(中国区)的考生们: 由于近期受疫情的影响,Pearson VUE暂时关闭了中国大陆的考试中心,并暂停至 2020 年 3 月底。 在此特殊阶段,针对无法预约并即将过期的考试券…

    2023-02-03
    147
  • ETC 读卡出错_etc未检测到标签

    ETC 读卡出错_etc未检测到标签摘要:本文通过对ETCD服务异常问题分析,代码展示解决方案。 本文分享自华为云社区《【实例状态】GaussDB ETCD服务异常》,作者:酷哥。 首先确认是否是虚拟机、网络故障 虚拟机故障导致ETCD

    2023-06-13
    148
  • MySQL Event历史记录

    MySQL Event历史记录需求 SQL Server的作业历史(Job)记录是保存在msdb库中的,很方便就查询相关的Job定义,计划和历史记录,而MySQL的event却没有历史记录。为方便查看event是否正常执行以及执行

    2022-12-24
    159

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注