原理:游标就是把数据按照指定要求提取出相应的数据集,然后逐条进行数据处理。

游标的概念

1.1游标(Cursor)

它使用户可逐行访问由SQL Server返回的结果集。

使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。

用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。

游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。

1.2SQL语言与主语言具有不同数据处理方式

(1).SQL语言是面向集合的,一条SQL语句原则上可以产生或处理多条记录
(2).主语言是面向记录的,一组主变量一次只能存放一条记录
仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,嵌入式SQL引入了游标的概念,用来协调这两种不同的处理方式。
游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。

1.3 游标的优点

从游标定义可以得到游标的如下优点,这些优点使游标在实际应用中发挥了重要作用:

1)允许程序对由查询语句select返回的行集合中的每一行执行相同或不同的操作,而不是对整个行集合执行同一个操作。

2)提供对基于游标位置的表中的行进行删除和更新的能力。

3)游标实际上作为面向集合的数据库管理系统(RDBMS)和面向行的程序设计之间的桥梁,使这两种处理方式通过游标沟通起来。

1.4 游标的使用

讲了这个多游标的优点,现在我们就亲自来揭开游标的神秘的面纱。

使用游标的顺序:声名游标、打开游标、读取数据、关闭游标、删除游标。

EXEC SQL DECLARE CURSORNAME CURSOR FOR
EXEC SQL OPEN CURSORNAME
EXEC  SQL FETCH CURSORNAME INTO 
EXEC SQL CLOSE CURSORNAME
不用游标的SQL语句的种类:
1.说明性语句 declare
2.数据定义语句 create,alter,drop
3.数据控制语句 grant,revoke
4.查询结果为单记录的SELECT语句 where查询中出现unique
5.非CURRENT形式的UPDATE语句
6.非CURRENT形式的DELETE语句
7.INSERT语句 
一、说明性语句是专为在嵌入式SQL中说明主变量、SQLCA等而设置的。
说明主变量
1.EXEC SQL BEGIN DECLARE SECTION;
2.EXEC SQL END DECLARE SECTION;
这两条语句必须配对出现,相当于一个括号,两条语句中间是主变量的说明。
说明SQLCA
3.EXEC SQL INCLUDE SQLCA
二、数据定义语句
例如:建立一个“学生”表Student
EXEC SQL CREATE TABLE Student
(Sno CHAR(5) NOT NULL UNIQUE,
Sname CHAR(20),
Ssex CHAR(1),
Sage INT,
Sdept CHAR(15));
数据定义语句中不允许使用主变量。
三、数据控制语句
例如:把查询Student表权限授给用户U1
EXEC SQL GRANT SELECT ON TABLE Student TO U1;
四、查询结果为单记录的SELECT语句
语句格式:
EXEC SQL SELECT [ALL|DISTINCT]<目标表达式>[,<目标表达式>]...
INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...
FROM <表名或视图名>[,<表名或视图名>]...
[WHERE <条件表达式>]
[GROUP BY <列名1>[HAVING<条件表达式>]]
[ORDER BY <列名2>[ASC|DESC]];
对交互式SELECT语句的扩充,多了一个INTO子句,把从数据库中找到的符合条件的记录,放到INTO子句指出的主变量中去。
使用注意事项:
1.使用主变量,只能出现在INTO子句、WHERE子句的条件表达式、HAVING短语的条件表达式
2.使用指示变量,指示变量只能用于INTO子句中。如果INTO子句中主变量后面跟有指示变量,则当查询得出某个数据项为空值时,系统会自动将相应主变量后面的指示变量置为负值,但不向该主变量执行赋值操作,即主变量仍保持执行SQL语句之前的值。当发现指示变量值为负值时,不管主变量为何值,均应认为主变量值为NULL。
3.查询结果为空集。如果数据库中没有满足条件的记录,即查询结果为空,则DBMS将SQLCODE的值置为100
4.查询结果为多条记录,程序出错,DBMS会在SQLCA中返回错误信息。
从提高应用程序的数据独立性角度考虑,SELECT语句在任何情况下都应该使用游标。
五、非CURRENT形式的UPDATE语句
使用主变量:出现在SET子句,WHERE子句。
使用指示变量:出现在SET子句。
非CURRENT形式的UPDATE语句可以操作多条元组。       
六、非CURRENT形式的DELETE语句
使用主变量:出现在WHERE子句中。
非CURRENT形式的DELETE语句可以操作多条元组。
七、非CURRENT形式的INSERT语句
使用主变量:出现在VALUES子句
使用指示变量:出现在VALUES子句
非CURRENT形式的INSERT语句一次只能输入一条元组。
必须使用游标的SQL语句          
1.查询结果为多条记录的SELECT语句。
2.CURRENT形式的UPDATE语句。
3.CURRENT形式的DELETE语句。                     
一、查询结果为多条记录的SELECT语句
使用游标的步骤:
1.说明游标
2.打开游标
3.移动游标指针,然后取当前记录
4.关闭游标
1.说明游标:使用DECLARE语句。语句格式:EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT语句>;功能:一条说明性语句,DBMS并不执行SELECT指定的查询操作。
2.打开游标:使用OPEN语句,语句格式:EXEC SQL OPEN <游标名>;功能:打开游标实际上是执行相应的SELECT语句,把所有满足查询条件的记录从指定表取到缓冲区中;这时游标处于活动状态,指针指向查询结果集中第一条记录之前。
3.移动游标指针,然后取当前记录。使用FETCH语句,语句格式:EXEC SQL FETCH [[NEXT|PRIOR|FIRST|LAST]FROM] <游标名> INTO <主变量>[<指示变量>][,<主变量>[<指示变量>]]...;功能:指定方向推动游标指针,然后将缓冲区中的当前记录取出来送至主变量供主语言进一步处理;NEXT|PRIOR|FIRST|LAST:指定推动游标指针的方式。
NEXT:向前推进一条记录。
PRIOR:向后回退一条记录。
FIRST:推向第一条记录。
LAST:推向最后一条记录。
缺省值为NEXT。
说明:
1.主变量必须与SELECT语句中的目标列表达式具有一一对应关系。
2.FETCH语句通常用在一个循环结构中,通过循环执行FETCH语句逐条取出结果集中的行进行处理。
3.为进一步方便用户处理数据,现在一些关系数据库管理系统对FETCH语句做了扩充,允许用户向任意方向以任意步长移动游标指针。
4.关闭游标:使用CLOSE语句,语句格式:EXEC SQL CLOSE <游标名>;功能:关闭游标,释放结果集占用的缓冲区及其他资源。说明:游标被关闭后,就不再和原来的查询结果集相联系,被关闭的游标可以再次被打开,与新的查询结果相联系。
二、CURRENT形式的UPDATE语句和DELETE语句:是面向集合的操作;一次修改或删除所有满足条件的记录。
如果只想修改或删除其中某个记录:用带游标的SELECT语句查出所有满足条件的记录;从中进一步找出要修改或删除的记录;用CURRENT形式的UPDATE语句和DELETE语句语句修改或删除之。
步骤:
(1).DECLARE,说明游标
(2).OPEN,打开游标,把所有满足查询条件的记录从指定表取至缓冲区
(3).FETCH,推进游标指针,把当前记录从缓冲区中取出来送至主变量
(4).检查该记录是否是要修改或删除的记录,是则处理之
(5).重复第(3)和(4)步,用逐条取出结果集中的行进行判断和处理
(6).CLOSE,关闭游标,释放结果集占用的缓冲区和其他资源。
为UPDATE语句说明游标:使用带FOR UPDATE OF <列名>短语的DECLARE语句。语句格式:EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT语句> FOR UPDATE OF <列名>;FOR UPDATE OF <列名>短语用于指明检索出的数据在指定列上是可修改的,以便DBMS进行并发控制。
为DELETE语句说明游标,使用带FOR DELETE短语的DECLARE语句。语句格式:EXEC SQL DECLARE <游标名> CURSOR FOR <SELECT 语句> FOR UPDATE;FOR UPDATE短语提示DBMS进行并发控制。
修改或删除当前记录:语句格式:<UPDATE语句> WHERE CURRENT OF <游标名>;<DELETE语句> WHERE CURRENT OF <游标名>。WHERE CURRENT OF <游标名>子句表示修改或删除的是该游标中最近一次取出的记录。
当游标定义中的SELECT语句带有UNION或ORDER BY子句时,或者改SELECT语句相当于定义了一个不可更新的视图时,不能使用CURRENT形式的UPDATE语句和DELETE语句。

部分转自:http://blog.sina.com.cn/s/blog_9c618eb9010158b8.html

转载于:https://www.cnblogs.com/muloulan/p/4851202.html

cursor(游标)相关推荐

  1. 【数据库学习笔记】——cursor游标对象

    目录 1.创建cursor对象 2.cursor对象常用方法 3.操作数据库的常见流程(五部曲) 课程视频链接: 第14节 Python操作数据库_哔哩哔哩_bilibili666https://ww ...

  2. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...

    url控制 第二种写法(只要继承了ViewSetMixin) url(r'^pub/$',views.Pub.as_view({'get':'list','post':'create'})), #获取 ...

  3. cursor游标(mysql)

    /* 游标 cursor 什么是游标?为什么需要游标 使用存储过程对sql进行编程的时候,我们查询的语句可能是数据是多个,它总是一口气全部执行,我们无法针对每一条进行判断.也就是说,我们无法控制程序的 ...

  4. Oracle中cursor(游标)总结

    1.       游标: 容器,存储SQL语句影响行数. 2.       游标类型: 隐式游标,显示游标,REF游标.其中,隐式游标和显示游标属于静态游标(运行前将游标与SQL语句关联),REF游标 ...

  5. oracle cusor游标,ORACLE CURSOR 游标详解

    DECLARE sqlStr       VARCHAR2(2000); --拼写sql flag         int; --判断是否存在 col_name     VARCHAR2(100); ...

  6. SQL Cursor(游标)

    1.游标在数据表没有id(identity(1,1))时好用,但是游标会吃更多的内存,减少可用的并发,占用宽带,锁定资源,当然还有更多的代码量 2.如果能不用游标,尽量不要使用游标,用完用完之后一定要 ...

  7. Mysql while 嵌套 cursor 游标, 数据迁移

    CREATE DEFINER=`root`@`%` PROCEDURE `removeAccPartnerSettle`() BEGIN#Routine body goes here...declar ...

  8. python cursor游标重置位置scroll_MySQL的游标

    python操作mysql 安装 python操作mysql数据库,主要就是通过pymysql模块 pip install pymysql 操作流程 1)建立数据库连接对象 conn 2)通过 con ...

  9. python cursor游标_第二十三天 python中游标的使用

    游标(cursor):系统为用户开通的一个数据缓冲区,用于存放SQL语句执行结果.用户使用的sql会逐一的在游标中获取记录,并赋值给主变量,交由Python进一步处理,一组主变量只能存放一条记录. 例 ...

  10. mysql cursor使用变量_mysql cursor游标的使用,实例

    mysql被oracle收购后,从mysql-5.5开始,将InnoDB作为默认存储引擎,是一次比较重大的突破.InnoDB作为支持事务的存储引擎,拥有相关的RDBMS特性:包括ACID事务支持,数据 ...

最新文章

  1. Docker 服务终端 UI 管理工具
  2. 未来几年,BCH超越BTC的路径是什么?
  3. mongoose框架示例代码解析(一)
  4. python pandas读取excel-Python使用Pandas读写Excel实例解析
  5. Linux学习笔记(六)
  6. python语法基础知识案例_Python 语法速览与实战清单
  7. JEECG列表嵌套查询列表子查询+号功能
  8. 【kafka】kafka 消息头的强大功能
  9. android优雅的一个侧滑
  10. java面试要点---Spring体系知识点复习,IOC,AOP---随时更新
  11. 中国无人车第一案!百度状告景驰王劲:窃取机密,不还电脑,索赔5000万
  12. linux load average,理解Linux中的Load Average
  13. hive内部表与外部表入门
  14. 五子棋小游戏(C++)
  15. 算法:唯一路径Unique Paths 动态规划和二项系数解法
  16. 推荐两个在线代理服务器
  17. 微信小程序连接低功率蓝牙控制单片机上硬件设备
  18. 设计模式实例学习-策略模式
  19. 九爷带你玩转 oracle
  20. 3个月学习成功上岗软件测试,我一个文科女也能吃IT饭了

热门文章

  1. 自建服务器系列- DDNS配置
  2. FY-4A数据预处理(一)
  3. C++培训_004_制作可视化wifi发射小程序
  4. nyoj1249 物资调度 (第七届河南省程序设计大赛)
  5. 王健林的新“小目标”:2018年计划收入2479亿元
  6. 分享Unity工具十天创建iPad游戏的经验
  7. STM32F103基于I2C协议的AHT20温湿度传感器的数据采集
  8. POLYVOLY保利沃利携三谷亮相上海美博会,用实力掀起浴之美学新风尚
  9. 黑马程序员——java基础--面向对象(篇一)
  10. python常用运算符号从高到低_python----运算符