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

PRINT

专业代码

:,+

@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

—提取游标结果集中的数据

并将字段值存放到相应

的游标变量中

PRINT

SPACE

(25)+,

-----文学院的学生名单------

,

PRINT

"

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.

言结构,相应地则设计提供了一种在服务器内部处理结果集

的方法。使用游标可以通过遍历操作逐一地从结果集中实现