基于SQL游标的研究与应用
摘要:在进行数据操作时,我们经常会遇到一些直接使用简单的sql语句无法直接处理的问题,如逐一的从某一结果集中读取一条记录进行某种操作的情况,利用sql中的游标功能可以有效的解决这类问题。本文通过对sql游标的研究,介绍了sql游标的基本原理及使用技巧,并结合实际阐述了如何利用游标来进行面向单条记录的数据处理。
关键词:游标 结果集
Based on the research and application of SQL cursor
AbstractDuring the data operation, we often encounter some problems of simple SQL statement cannot directly solve issues, such as reading a record from the result set one by one to do some operation, the use of the cursor functions in SQL can effectively solve these problems. This article through to the SQL cursor research, introduced the SQL cursor basic principle and use of skills, combined with the reality elaborated how to use the cursor to do the single record data processing.
Key words: CursorResult set
关系型数据库中的数据操作是面向整个结果集的,由selectupdateinsert等语句返回的所有满足where子句条件的行被称为结果集,但是有时根据应用程序需要不能将整个结果集作为一个有效的单元来处理,是要从某一结果集中逐一读取一条记录,这时只用select查询语句是不能实现此功能需求的,这时就需要借助游标机制来实现单条记录的数据处理,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力,它像一个指针,可以指定结果集中的任何位置,然后允许用户对指定位置的数据进行处理。
1 游标概述
1.1 游标的定义
游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。游标是由结果集和结果集中指向特定记录的游标位置组成。
1.2 游标的优点
·允许定位在结果集的特定行;sql触发器的使用
·允许从结果集的位置检索一行或多行;
·支持对结果集中当前位置的行进行数据修改;
·为由其他用户对显示在结果集中的数据库数据所做的更改提供不同级别的可见性支持;
·提供脚本、存储过程和触发器使用的用于访问结果集中数据的T-SQL语句。
1.3 游标的基本操作
每一个游标必须有4部分组成:
1)声明游标;
2)打开游标;
3)从一个游标中查信息;
4)关闭游标。
游标使用流程如图1所示。
SQL SERVER提供了一个全局变量(@@FETCH_STATUS)指示游标的移动。如果@@FETCH_STATUS=0表示FETCH语句执行成功;如果为-1表示FETCH语句执行失败或
者此行不在结果集中,如果为-2表示提取的数据行不存在,FETCH语句经常和WHILE循环结合使用,下面通过一个具体的实例来使我们深刻理解游标的原理及应用。
2 游标应用实例
笔者所在学校要求学生对教师的教学情况进行评教打分,最后要求查询计算得出每位教师讲授每门课程的平均得分
评教分值表简化定义如下:
功能需求是根据输入不同的教师编号和课程编号,可以在评教分值表中查询出与此对应的教师姓名、课程名称、平均得分,平均得分是查询结果集所有记录中按分值降序排列后去掉前
后各10%记录的分值平均值。因为是取结果集中间的一部分记录,用以往的数据操纵语句如select 是不能定位符合此要求的结果集,select只能取结果集中最顶部或最尾部部分记录,如select top n percent * from评教分值表(order by score desc,或者取符合条件的全部记录,如select * from评教分值表,所以要想取结果集中的特定记录,就需要使用游标,游标就像一个指针,它可以在结果集中一条一条的移动记录,根据条件要求对结果集中的每一行进行相同或不同的操作,以实现用户处理数据的复杂要求。在本例中,可以使用游标定位结果集中除去按分值降序排列后前10%记录中第一条记录的位置,记录有效成绩值,然后游标不断下移,并将累计求和所有有效成绩值,直到游标移动到按分值降序排列后10%记录位置,停止累计求和,最后将有效成绩之和除以有效记录数即是某位教师讲授某门课程的平均得分。