关于游标的一些总结

游标本质上是一种从select结果集中每次提取一条记录的机制,因此游标与select语句息息相关。
使用游标的步骤:
1.声明游标 declare 游标名 cursor for select语句
2.打开游标 open 游标名
3.从游标中提取数据 fetch 游标名 into 变量(需要配合循环使用)
4.关闭游标 close 游标名称

备注:
1.变量名的个数必须与声明游标时使用的select语句结果集中的字段个数保持一致。
2.fetch在执行过程中如果无法提取数据会产生ERROR 1329(0200):Nodata to FETCH,这样我们可以自定义1329错误来结束遍历。

做特别复杂的判断的时候可能会用到游标,但是游标同触发器一样对性能影响很大,所以尽量不要用游标和触发器。

这里用Navicat for MySQL工具写一个demo。

首先创建一个学生表

 1 mysql> create table student(s_name varchar(20) not null default ‘不详‘,sex varchar(4) not null default ‘不详‘,s_no int(5) auto_increment,age int(3) not null,height int(3) not null,primary key(s_no));
 2 Query OK, 0 rows affected
 3
 4 mysql> insert into student (s_name,sex,age,height) values(‘小张‘,‘男‘,21,176);
 5 Query OK, 1 row affected
 6
 7 mysql> insert into student (s_name,sex,age,height) values(‘小李‘,‘男‘,22,175);
 8 Query OK, 1 row affected
 9
10 mysql> insert into student (s_name,sex,age,height) values(‘小明‘,‘男‘,25,178);
11 Query OK, 1 row affected
12
13 mysql> insert into student (s_name,sex,age,height) values(‘小红‘,‘女‘,23,165);
14 Query OK, 1 row affected
15
16 mysql> insert into student (s_name,sex,age,height) values(‘小丽‘,‘女‘,19,160);
17 Query OK, 1 row affected
18
19 mysql> select * from student;
20 +--------+-----+------+-----+--------+
21 | s_name | sex | s_no | age | height |
22 +--------+-----+------+-----+--------+
23 | 小张   | 男  |    1 |  21 |    176 |
24 | 小李   | 男  |    2 |  22 |    175 |
25 | 小明   | 男  |    3 |  25 |    178 |
26 | 小红   | 女  |    4 |  23 |    165 |
27 | 小丽   | 女  |    5 |  19 |    160 |
28 +--------+-----+------+-----+--------+
29 5 rows in set

利用游标将年龄小于23,身高低于175的学生的身高改为180,其他学生的身高改为169

 1 delimiter $$
 2 drop procedure if exists pro_student;
 3 create procedure pro_student()
 4 begin
 5     declare tage int;
 6     declare theight int;
 7     declare tno int;
 8     declare state varchar(20);
 9     declare cur_student cursor for select s_no,age,height from student;
10     declare continue handler for 1329 set state=‘error‘;
11     open cur_student;
12     repeat
13     fetch cur_student into tno,tage,theight;
14     if tage<23 and theight<175
15     then
16         update student set height=180 where s_no=tno;
17     else
18         update student set height=169 where s_no=tno;
19     end if;
20     until state=‘error‘
21     end repeat;
22     close cur_student;
23 end $$
24 delimiter;

运行之后调用

call pro_student();

学生表student变成了

 1 mysql> select * from student;
 2 +--------+-----+------+-----+--------+
 3 | s_name | sex | s_no | age | height |
 4 +--------+-----+------+-----+--------+
 5 | 小张   | 男  |    1 |  21 |    169 |
 6 | 小李   | 男  |    2 |  22 |    169 |
 7 | 小明   | 男  |    3 |  25 |    169 |
 8 | 小红   | 女  |    4 |  23 |    169 |
 9 | 小丽   | 女  |    5 |  19 |    180 |
10 +--------+-----+------+-----+--------+
11 5 rows in set
时间: 2024-12-30 19:09:39

关于游标的一些总结的相关文章

SQL Server 游标使用

1.声明游标            DECLARE 游标名 CURSOR SELECT语句(注:此处一定是SELECT语句)        2.打开游标           OPEN 游标名        3.读取游标数据           Fetch [Next | Prior | First | Last | Absolute n | Relative n ]  From 游标名 INTO @name1,@name2...            WHILE(@@FETCH_STATUS =

oracle(sql)基础篇系列(五)&mdash;&mdash;PLSQL、游标、存储过程、触发器

  PL/SQL PL/SQL 简介 每一种数据库都有这样的一种语言,PL/SQL 是在Oracle里面的一种编程语言,在Oracle内部使用的编程语言.我们知道SQL语言是没有分支和循环的,而PL语言是为了补充SQL语言的,是带有了分支和循环的语言. PL/SQL 语法 基本数据类型声明 declare v_name varchar2(20); v_temp number(1); v_count binary_integer := 0; v_sal number(7,2) := 4000.00

[转载]oracle游标概念讲解

原文URL:http://www.2cto.com/database/201203/122387.html ORACLE游标概念讲解 什么是游标?  ①从表中检索出结果集,从中每次指向一条记录进行交互的机制.      ②关系数据库中的操作是在完整的行集合上执行的.   由SELECT 语句返回的行集合包括满足该语句的WHERE 子句所列条件的所有行.由该语句返回完整的行集合叫做结果集.      应用程序,尤其是互动和在线应用程序,把完整的结果集作为一个单元处理并不总是有效的.      这些

ActiveMQ消息游标 --转载

转:http://blog.csdn.net/m13321169565/article/details/8081358 在Activemq以前的版本中,broker会把待发送的消息保存在内存中.这种方式的缺陷是当消费者消费的速度赶不上生产者的速度时,会在broker的内存中积攒大量的消息,当达到一个限额后,broker就不再接收消息.这时生产者就被阻塞了,直到broker将内存清理能保存消息后才能继续发送.     在5.0版本后,Activemq实现了一种新的内存模型来防止慢消费者阻塞快速生产

plsql游标的介绍

3. 游标的介绍    游标:一个指向保存多行SQL查询结果集的工作区的句柄(指针) 3.1 显式游标 (1)显式游标的使用 案例1:定义变量的方式使用游标 declare  cursor csr_org is select h.hrc_descr,o.org_short_name                      from org_tab o,hrc_tab h                     where o.hrc_code=h.hrc_code               

PL/SQL 编程(二)游标、存储过程、函数

游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段. 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录. 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标. 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行.打开游标后,用户可以利用游

python使用游标访问数据

游标是一种数据访问对象,可用于在表中迭代一组行或者向表中插入新行.游标有三种形式:搜索.插入或更新.游标通常用于读取现有几何和写入新几何. 每种类型的游标均由对应的 ArcPy 函数(SearchCursor.InsertCursor 或 UpdateCursor)在表.表格视图.要素类或要素图层上创建.搜索游标可用于检索行.更新游标可用于根据位置更新和删除行,而插入游标可用于向表或要素类中插入行. 游标 说明 InsertCursor(dataset, {spatial_reference})

【MySQL】存储过程、游标、循环简单实例

有时候仅凭 sql 语句可能达不到想要的数据操作目的,有可能需要写一些方法体,通过循环判断等操作最终达到目的.那么在数据库里实现这种方法体就需要存储过程了,个人觉得一个带注释的简单实例可以简单粗暴地解决大部分问题,当然要深入学习了解的话还是要看教程文档了,话不多说,上码: [sql] view plain copy create procedure my_procedure() -- 创建存储过程 begin -- 开始存储过程 declare my_id varchar(32); -- 自定义

mongo数据删除和游标

数据删除 db.集合.remove(删除条件,是否只删除一个数据);默认删多条(false)true删除一条db.集合.remove({}) 删除所有元素但集合还在db.集合.drop() 删除集合 游标指数据可以一行行的进行操作,类似ResultSet数据处理在mongo里是需要使用find()就可以返回游标了对于操作返回的游标,可使用函数操作1.判断是否有下一行数据:hasNext()2.取当前数据: next() var cur=db.web.find();cur.hasNext();cu

『ORACLE』 PLSQL游标的使用(11g)

游标分类 隐式游标: 对于select..into...语句,一次只能从数据库中获取到一条数据,对于这种类型的DML SQL语句,就是隐式cursor select update/insert/delete操作 显示游标: 由程序员定义和管理,对于从数据库中提取多行数据,就需要使用显式cursor 1.定义游标---cursor  [cursor name]  is 2.打开游标---open    [cursor name] 3.操作数据---fetch    [cursor name] 4.