MYSQL 游标学习及使用实例


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

 

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

 

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

--2.打开游标数据库

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

--4.定位游标到哪一行服务器

 

使用实例函数

一、搭配while循环语句使用oop

# 代码使用目的: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

二、与loop循环语句使用学习

## 代码目的:统计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

三、与repeat循环语句使用spa



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

http://www.javashuo.com/article/p-skojkruw-dx.html