2024年6月5日发(作者:)
第卷第
66
期
2
〇
1
6
年
12
月
INTELLIGENT COMPUTER AND APPLICATIONS
智能计算机与应用
V
〇
1.6 N“
2016
基于
SQL
游标的数据库应用与探析
张润,方继才
(安徽机电职业技术学院信息工程系,安徽芜湖241000)
摘要
:针对一些数据操作直接使用
SQL
语句无法处理的问题,在深入分析此类问题遍历操作的基础上,文中结合
SQL
中的游标相关知识和
使用规则,给出了一种基于
法的有效性。
SQL
游标的数据处理方法,最后在
SQLSfilw
2012环境的基础上,对研究所述进行了相关验证,验证结果表明此类方
关键词
:
SQLServer
;游标;结果集;遍历
中图分类号
:
TP
391 文献标志码
:
A
文章编号
:
2095-2163(2016)06-0084-04
Database application and analysis based on SQL cursor
ZHANG Run, FANG Jicai
(
Depart^nent
of
Infor^nation
Engineering
,
Anhui
Technical
College
of
Mechanical
and
Electrical
Engineering
,
Wuhu
Anhui
241000,
China
)
Abstract
:
In
order
to
solve
the
data
processing
problem
that
is
not
suitable
for
direct
use
of
SQL
commands
,
this
paper
proposes
a
novel
data
processing
method
based
on
SQL
cursor
.
First
,
analyze
the
traversal
problem
.
Second
,
combine
the
cursor
usage
rules
.
Third
,
verify
the
result
on
SQL
server
2012.
The
results
show
the
effectiveness
of
the
proposed
method
.
:
SQL
Server
;
cursor
;
result
set
;
traversal
Keywords
o引言
SQL
Server
2012是一款功能完善、且设计高端的关系型
需求,如:在结果集中一次一行或者多行向前或向后浏览数据
的操作。
在游标的实现上,则总是与一条
T
-
SQL
语句相关联。这
是因为游标是由结果集和结果集中指向特定记录的游标位置
集结联合所组成,组成示意如图1所示。其中,游标结果集是
定义游标的
SQL
语句返回的行的集合,游标位置则是指向这
个行集合中某一行的当前指针。在
SQL
Server
中,用户可以
通过
SQL
语句逐一地从游标中读取记录,还可以使用游标处
理结果集中的数据,具体包括了更新、删除等操作。
游标结果集
游标位置
数据库管理系统,关系型数据库中的数据操作通常都是面向
整个结果集的,而结果集又是由
Select
、
Update
、
Insert
等语句
返回的所有满足
Where
子句条件的行。在数据库的开发过程
中,常常使用
T
-
SQL
语句将整个结果集作为一个单元来进行
处理,然而实际上很多时候用户需要对结果集中的某一行或
者多行分设相同或不同的操作,例如要从结果集中逐一读取
每一条记录、更新或者删除结果集对应表中某一行的数据等
等,此时若仅是运用
T
-
SQL
语句则将无法满足这一功能需
求,为此就需要借助于游标机制来实现逐条记录的数据处
理⑴。而且,还有很多应用程序,尤其是将
SQL
嵌人到其它
开发语言时,这些语言或程序并不能把整个结果集作为一个
单元来开展有效的控制处理,而只能处理一行或者部分行,这
时候就更加需要使用游标。
1 SQL游标的概述
游标作为数据库的重要对象,不仅表现为一种数据访问
机制,同时也是一种数据处理方法,具有对结果集进行逐行处
理的能力;而且,游标还提供了一种对从表中检索出的数据定
制各类操作的灵活手段。就本质而言,游标实际上即是一种
能从包括多条数据记录的结果集中每次提取一条记录的机
制[2]。游标就好比
C
语言中的指针,通过与某个查询结果构
建技术联系,可以指定结果集中的任何位置,然后允许用户对
指定位置的数据进行处理,以达到用户处理数据的复杂目的
收稿日期:
2016-11-16
基金项目:
2014年安徽省质量工程项目(2014
jxtd
099)。
作者简介:
张润( 1979-),男,学士,实验师,主要研究方向:数据库应用
图
1
游标的组成
Fig. 1 Composition of cursor
2 SQL游标的作用及优势
在
SQL
Server
中,游标主要是用来对结果集引人“行集”
性质的相关操作。也就是说,当在存储过程、触发器和批处理
中使用
T
-
SQL
语句返回结果集的多条记录时,游标则给出了
一个可以对记录进行逐条处理的有效方法。
研究可得,使用游标的重点效应优势可作如下阐析:
1)游标允许用户访问或处理一个集合里的单独数据行,
第6期张润,等:基于
SQL
游标的数据库应用与探析
3.2游标的打开
• 85 •
而不受其他行的限制约束,这也是游标设计上的鲜明优势。
基于此,用户就可以使用这些数据生成
SQL
代码并立即执行
或输出,这样就能降低系统开销和潜在的阻隔情况。
2)
游标在发出声明后,必须使用
Open
语句来打开游标,才
能展开进一步的数据提取。打开游标的示例语句为:
Open
cur
_
xsxx
。
使用游标查看或处理数据使得用户的操作过程更加
灵活、高效、方便。
3) 在
SQL
Server
数据库系统中,游标可分为服务器游标
和客户游标。相对于客户游标而言,服务器游标可以大大减
少网络数据传输的开销,从而提高应用程序访问数据库的速
度和效率。
4)
打开游标时,需要注意两点:
1) 若打开的是全局游标,则必须添加关键字
Global
,否
打开的就将是默认的局部游标。
2) 游标的打开可能会产生问题
,SQL
Server
即是通过
@
Error
全局变量的值来判断游标打开的成功与否:为0表示
作为面向集合的数据库管理系统(
RDBMS
)和面向行
成功,为1表示失败。
的程序设计之间的设计媒介,游标可使得这2种处理方式能
够获得有效拓展连接[3]。
3 SQL游标的使用
SQL
游标一般用于存储过程、触发器和
Tra
脱
ct
-
SQL
脚
本中。在
SQL
Server
中使用游标处理数据时需要遵循一定的
规则,研究给出其使用流程如图2所示。
图
2
游标的使用流程
Fig. 2 Using the cursor
从图2中可以看出,
SQL
游标的使用流程可具体表述如
下:首先声明游标,然后打开游标,再从游标中提取数据应用
于相关操作,直至所有记录均已标明处理,由此即关闭并释放
游标。
3.1游标的声明
与变量一样,在游标使用前也要预先设定游标声明。通
过声明来定义游标的名称、游标指向的结果集和游标的属性。
简单的示例语句为:
Declare
cur_xsxx
Cursor
For
Select
xh
,
xm
,
xb,sfz
From
xsxx
;
该语句定义了一个名为
cur
_
xsxx
的游标,且指向一个从
xsxx
(学生信息表)表中查询出
xh
、
xm
、
xb
和
sfz
字段内容的结
果集。
在上述示例语句中,游标名称
Cursor_name
(游标变量@
Cursor
_
name
)是用户此后若涉及到该游标时将会使用的名
字,关键字
Cursor
指明此变量是游标类型,关键字
For
和
Select
语句定义了游标的内容。此外,声明游标的
T
-
SQL
语
句还提供了一些更多的关键字选项,如
Scroll
、
Static
、
Read
_
Only
等等,各个选项也将呈现各不相同的作用。
3.3游标的提取
打开游标后,就可以读取游标中的数据了。提取游标的
示例语句为:
Fetch
Next
From
cur_xsxx
into
@
xh
,@
xm
。
该语句表示将游标结果集所指的记录中字段
xh
和
xm
的
值赋给局部变量@
xh
和@
xm
中。在读取游标时,数据所在
的记录位置总共设有6个关键字(
Next
、
Prior
、
First
、
Last
、
Absolute
和
Relative
)用于条件选择。
3.4游标的关闭和释放
在游标使用进程结束后,要及时关闭和释放游标,以利于
服务器释放曾分配给游标占用的
SQL
Server
系统资源。关闭
游标的示例语句为:
Close
cur
_
xsxx
;
释放游标的示例语句为:
Deallocate
cur
_
xsxx
。
游标被释放后就不能重新打开了,除非再次重新声明游
标。
4 SQL游标的应用实例与分析
游标的应用重点可表现在2个方面:
1) 使用游标从结果集中检索数据,以实现对数据的逐
查看,也就是平时经常遇到的一种操作——遍历。
2) 使用游标可以对结果集中的数据进行更新或删除[
改变游标中的数据,自然会影响到数据库中基础表的数据,若
要使游标中的数据不致发生修改,则可以在声明游标时添加
Insensitive
选项。
在此,将以某个学校学费收缴管理系统中的学校收费数
据库为背景,研究给出2个具体实例来阐释说明
SQL
Server
中游标的使用方法和应用实现。
4.1游标的遍历
4.1.1应用说明
所谓遍历,就是指沿着某条搜索路线,依次对树中的每个
结点均将经历一次的访问。而对于游标的遍历而言,游标所
对应的结果集是指树,结果集中的每一条记录(每一行)是指
每个结点,游标的遍历实际上就是指游标的逐行取数操作。
在
SQL
Server
中,游标的使用主要集中在对游标所指结
果集的遍历操作。通常在执行
Fetch
语句(读取游标数据)的
时候,可以借助于全局变量@ @
Fetch
_
Status
(返回游标当前
的状态)的值来判断提取数据的操作是否成功。若值为0,表
明读取数据成功;若值为-1,表明执行失败或此行不在结果
集中;若值为-2,表明读取的数据行不存在。在实际研发中,
•86.
智能计算机与应用
第6卷
@
Feteh
语句经常和
While
语句结合使用来生成对结果集中的
每一行数据实现遍历的操作
。
下面则通过一个完整实例来直
观展现游标便利的功能应用流程
。
4.1.2
实例分析
实例1
(
WHILE
@
—检查
@
FETCH_STATUS
= 0
@
FETCH
_
STATUS
,
确定游标读取数据是否
正确
,
若正确则循环遍历结果集中的数据
利用游标遍历从
xxsf
数据库的
XSXX
(
学生信息
表
)
和
zy
rf
(
专业收费表
)
中显示所有文学院学生的专业代码
BEGIN
,
专业代码
:,+
@zydm
+ '
专业名称
:,+
@zymc
+ '
隶属院系
:'+@
lsyx
+'
学号
:'+@
xh
+'
姓名
:'+@
xm
FETCH
NEXT
FROM
cur_college
INTO
@
zydm
,@
zymc
,
@
lsyx
,@
xh
,@
xm
----
读取下一■条数据
END
CLOSE
cur_college
----关闭游标
—输出数据
zjdm
)、
专业名称
(
Z5
^
m
)、
隶属院系
(
ls
)。)、
学号
(
xh
)
和姓名
(
xm
),
并以报表的形式提供结果输出
。
当前数据库的基础表
xsxx
和
zysf
,
表的结构可如表
1
和
表
2,
字段
Z
5
Tlm
、
Z
5
^
nc
和
ls
5
f
x
来源于表
2,
字段
Z
5
T
]
m、xh
和
xm
来源于表
1。2
张表将通过公共字段
zydm
建立连接
。
表
1
学生信息表(
XSXX)
Tab. 1 Student information table(xsxx)
学生信息信息含义
rxnf
入学年份
xh
学号
xm
姓名
xb
性别
ksh
考生号
sfz
身份证号
zydm
专业代码
zsid
住宿标准
表
2
专业收费表(
zysf)
Tab. 2Professional fee table (zysf)
专业信息
信息含义
zydm
专业代码
zymc
专业名称
lsyx
隶属院系
pycc
培养层次
xxnx
学习年限
xfbz
学费标准
jcfbz
教材费标准
通过游标实现数据遍历的关键代码如下
:
DECLARE
@
zydm
char
(4),@
zymc
varchar
(50),@
lsyx
varchar
( 20),@
DECLARE
xh
char
( 9),@
xm
char
( 8)----
声明变量
cm
二
college
CURSOR
FOR
----声明游标
SET
E
CT
zysf
.
zydm
,
zymc,l
syx
,
xh,xm
FROM
xsxx,zysf
WHERE
=
and
lsyx
=’
文学院
’
FOR
READ
ONLY
OPEN
cur_college
----打开游标
FETCH
NEXT
FROM
cur_college
INTO
@
zydm
,@
zymc
,
@
lsyx
,@
xh
,@
xm
—提取游标结果集中的数据
,
并将字段值存放到相应
的游标变量中
SPACE
(25)+,
-----文学院的学生名单------
,
"
DEALLOCATE
cur_college
----释放游标
在上述代码中
,
主要是通过两个
fe
tch
和一
■
个
while
语句
的结合使用来完成游标的遍历
。
第一次使用
fe
tch
语句获取
第一条记录的内容
,
然后在循环中再次使用
fe
tch
语句来获取
下一条记录的内容
,
直至游标溢出循环才真正结束
。
此外
,
还
有一种方式也可以实现游标的遍历
。
代码如下
:
WHILE
1 = 1
-----条件为永真
BEGIN
FETCH
NEXT
FROM
cur_college
INTO
@
zydm
,@
zymc
,
@
lsyx
,@
xh
,@
xm
IF
@ @
FETCH_STATUS
= 0
—若读取数据正确则
进行相关操作
ELSE
BREAK
—游标溢出即遍历结束后跳出循环
END
相对于第一种方式而言
,
第二种方式主要是通过永真的
循环只使用一次
fe
tch
语句来实现游标的遍历
。
本节研究中
提出的这
2
种方式在执行遍历操作上
,
均展现有良好效能
。
但从某种程度上来讲
,
第一种方式更加简洁
、
直观
。
4.2使用游标更新数据
4.2.1
应用说明
游标在声明的时候若定义为可更新的
,
则可用
Update
语
句来修改基础表中某行的数据
,
当然也可以执行删除某行的
操作
,
但不能插人新行
。
一般情况下
,
在
Where
子句中给定了条件才能修改或删
除数据
,
但鉴于游标不能自动对行实现更新或删除的原因
,
因
此在声明游标的时候使用了
For
Update
Of
语句
,
这样就可以
在
Update
或
Delete
命令中利用
Where
Current
Of
关键字直接
修改或删除当前游标中存储的数据
,
而不必使用
Where
子句
重新给出指定条件[5]
。
4.2.2
实例分析
实例二利用游标将数据表
xsxx
中第
3
位同学的人学
年份
(
rxnf
)
改为
2012
年
(
这里只显示
xm、xb
xsxx
表中的
rxnf
、
xh
、
和
sfz
字段
)。
关键代码如下
:
DECLARE
cmr_xg
SCROLL
CURSOR
FOR
SELECT
rxnf
,
xh
,
xm
,
xb,sfz
from
xsxx
FOR
UPDATE
OF
rxnf
—定义表中需要修改的数据列
OPEN
cmr_xg
(
下转第
89
页
)
第6期方自远:
SQL
注人攻击及其检测防御技术研究
•89.
在设计上保证不会将错误信息暴露给
Web
系统使用者;而当
涉及到数据库访问时,应采用加密传输,保证绝不使用明文传
递参数;另外,针对
SQL
注人攻击常用方式,应尝试设立
SQL
语句的关联构建规则。
3.3系统管理维护防御措施
系统管理员应及时更新可为
Web
系统运行提供基础支
持的关键软件,确保攻击者无法通过操作系统漏洞进行人侵。
此外,应关闭相关对外连接端口,如
TCP
1433
/UDP
1434。系
统管理员还应定期检查系统中用户密码,提升密码强度,建立
密码定期更换的长效机制。同时,
Web
系统管员也要定期对
Web
系统日志引人安全审核,检查是否存在异常访问记录,确
当前的时代是一个互联网时代。网络安全问题既是互联
网安全问题,也是社会安全问题。作为网络中最为常见的攻
击手段
,SQL
注人攻击给互联网造成了巨大的破坏,也带来了
难以估量的经济损失。因而研究实现有效防御
SQL
注人攻
击,对于提升
Web
网络系统的安全性无论从经济、社会、伦理
方面都将具有重要意义。
参考文献:
[1] 杨章琼,陈效军,王涛.
[2] 杨丰嘉.浅谈网站
SQL
注人攻击浅析[」].计算机光盘软件
与应用,2012(16) :103-104.
SQL
注人攻击防护[」].计算机光盘软件与应
用,2013(13) :144.
[3] 刘秀梅,辛阳,徐勤.
201609-190.
[4] 庞博,高杰.基于
保能够及时发现系统安全隐患。
SQL
注人攻击及防御方法研究[
EB
/
OL
].
[2016-09-21 ].
http
://
v
v
v
.
paper
.
edu
.
cn
/
releasepaper
/
content
/
ASP
.
NET
的
SQL
注入攻击与防范[」].轻工科
SQL
注入攻击检测与防御研究[」].河
M
4结束语
作者在本文中介绍了
SQL
注人攻击的原理和方法、如何
技,2009,25(9) :86-87.
[5] 齐林,王静云,蔡凌云,等.
北科技大学学报,2012,33(6):530-533.
[6] 郑斌.黑客攻防入门与进阶[].北京:清华大学出版社,2010.
检测
SQL
注人漏洞、怎样防御
SQL
注人攻击方面的内容。通
过本文,读者对
SQL
注人建立了一个全面清晰的认识,对如
何检测和防御
SQL
注人攻击也获得了基本了解,并掌握了一
定的基础方法及有效防范手段。
(上接第86页)
FETCH
ABSOLUTE
3
FROM
cur_xg
--返回第 3 行并将其变
数据读取,也可以对结果集中某些数据重点加设更新或删除
的操作。本文以学校收费数据库为背景并结合具体的实例来
阐述游标的使用,游标可以面向结果集中的每一行进行相同
或不同的操作,这不仅提升了
SQL
语句处理复杂查询的能
力,而且还降低了系统开销和潜在的阻隔情况,在一定程度上
解决了许多应用程序不能把整个结果集作为一个单元来处理
的问题。
为当前行
UPDATE
xsxx
SET
rxnf
= 2012 --更新当前行的列值
WHERE
CURRENT
OF
cur_xg
--当前游标指针所指的
当前行数据
CLOSE
cur_xg
DEALLOCATE
cur_xg
这里需要注意的是,游标的第二种应用是一种不规范的
更新数据的途径,很容易造成数据的不一致,因此通常状况下
并不选用游标来设计更新数据表中的数据。
另外,还需提及的就是,本文实例所用的数据表均基于
xxSf
(学校收费数据库)中的2个表,分别是:
xsxx
(
rxnl
,
xh
,
xm
,
xb
,
ksh
,
sfz
,
zydm
,
zsid
)
zysf
(
zydm
,
zymc
,
lsyx
,
pycc
,
xxnx
,
xfbz
,
j
〇
fbz
)
参考文献:
[1] 赵慧玲,毛应爽,孟宪颖.基于
创新导报,2012(28) :31-32.
[2] 刘志成,宁云智,刘钊,编著
子工业出版社,2013.
[3] 薛丽香,汪东芳.浅谈
[4] 陈芳勤
SQL
游标的研究与应用[」].科技
.SQL
Server
实例教程[
M
].北京:电
SQL
Server
数据库中游标的使用[」].福建
电脑,2016(6) :157-158.
5结束语
SQL
Server
中的游标在原理上具有
C
语言指针一样的语
.SQL
Server
2000中游标的应用[」].中国科技信息,2008
Online
Judge
中的应用[」].绍兴文理学院学报
(13) :96,99.
[5] 黄龙军.游标在
(自然科学),2012,32(8) :26-29.
言结构,相应地则设计提供了一种在服务器内部处理结果集
的方法。使用游标可以通过遍历操作逐一地从结果集中实现


发布评论