一个SQL游标的应用实例

2014-11-14 10:34戴晴宜
科技资讯 2014年12期

戴晴宜

摘 要:关系数据库中的操作会对整个行集起作用,应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。本文通过一个实例,介绍了SQL存储过程中游标的使用。

关键词:SQL游标 游标嵌套 试用权限

中图分类号:TP311 文献标识码:A 文章编号:1672-3791(2014)04(c)-0026-02

二次文献共建共享网络服务平台(以下简称平台)是《全国报刊索引》编辑部一个网络服务平台,它利用现代化信息技术和服务手段,联合海内外广大图情界同仁,在特色资源、近代文献等珍贵文献抢救和发掘方面合作共建,为广大读者用户提供良好的信息参考和决策咨询服务,也为海内外研究国学的人士获取信息提供更多的便利。目前,《全国报刊索引》编辑部已拥有全文数据库、索引数据库、专题数据库和特色资源数据库四种类型数据库。[1]

在平台的运维工作中,经常会收到服务组提出的技术支持请求。有一次,为了配合数据库产品的推广活动,服务组希望技术部协助为一批试用用户账号开放产品试用权限。

平台的文献数据库产品结构如图1所示,分为三层:产品大类(如全文库、索引库等)、产品类(如晚清期刊全文数据库(1833~1911)、民国时期期刊全文数据库(1911~1949)等)、产品(如遐迩贯珍、点石斋画报等)。这次收到的要求是,按不同需要分配产品权限:如单个产品的试用、单个产品类的试用。

按照惯例,类似这种临时性的数据处理请求,以SQL存储过程的方式来完成数据处理的相关任务,再根据实际需要,评估是否需要将该功能加到平台应用中。

1 单个产品的试用权限

这里要做的是为每一个试用账号在产品试用表中添加一条记录,由于需要对试用账号这个查询结果集进行逐行处理,因此,需要使用一个游标来实现,具体如下:

……

DECLARE @trid INT

DECLARE @cp INT

DECLARE usr CURSOR FOR

SELECT

trial_id

FROM trialusr

OPEN usr

FETCH NEXT FROM usr INTO @trid

WHILE @@fetch_status = 0

BEGIN

SET @cp = X /* X为任意数字 */

BEGIN TRANSACTION;

INSERT INTO trialcp(trial_id,cp,start,end)

VALUES(@trid,@cp,GETDATE(),(GETDATE()+7))

COMMIT;

FETCH NEXT FROM usr INTO @trid

END

CLOSE usr

DEALLOCATE usr

……

2 单个产品类的试用权限

在这个需求中,有2个结果集,一个是试用账号,另一个是产品类中的产品id,并且两者都需要进行逐行处理,以实现一对一的关系,因此考虑使用2个游标,并且嵌套使用,具体如下:

……

DECLARE @trid INT

DECLARE @cpl varchar(50)

DECLARE @cp INT

SET @cpl=捪挚饕?1950~)?

DECLARE usr CURSOR FOR

SELECT

trial_id

FROM trialusr

OPEN usr

FETCH NEXT FROM usr INTO @trid

WHILE @@fetch_status = 0

BEGIN

BEGIN

DECLARE cur_cp CURSOR FOR

SELECT cpid

FROM cplist

WHERE cpl = @cpl

OPEN cur_cp

FETCH NEXT FROM cur_cp INTO @cp

WHILE @@fetch_status = 0

BEGIN

BEGIN TRANSACTION;

INSERT INTO trialcp(trial_id,cp,start,end)

VALUES(@trid,@cp,GETDATE(),(GETDATE()+7))

COMMIT;

FETCH NEXT FROM cur_cp INTO @cp

END

CLOSE cur_cp

DEALLOCATE cur_cp

FETCH NEXT FROM usr INTO @trid

END

CLOSE usr

DEALLOCATE usr

……

以上,是根据服务组提出的技术支持需求,形成的解决方案,在测试数据库中测试及调试后,证实该方案可行,并准确实现了服务组的要求。

3 结语

关系数据库中的操作会对整个行集起作用。由SELECT语句返回的行集包括满足该语句的WHERE子句中条件的所有行。这种由语句返回的完整行集称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。[2]

本次技术支持任务中,尝试了通过游标的使用,来实现批量数据的逐行处理。在数据处理的工作中,经常会遇到类似对数据集进行逐行处理的任务,希望本实例,可以为SQL的初学者提供参考。

参考文献

[1] 《全国报刊索引》二次文献共建共享网络服务平台数据库资源介绍[EB/OL].http://www.cnbksy.com/shlib_tsdc/product/list.do.

[2] MSDN—Transact-SQL 参考:游标(数据库引擎)[EB/OL].http://msdn.microsoft.com/zh-cn/library/ms191179(v=sql.105).aspx.endprint

摘 要:关系数据库中的操作会对整个行集起作用,应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。本文通过一个实例,介绍了SQL存储过程中游标的使用。

关键词:SQL游标 游标嵌套 试用权限

中图分类号:TP311 文献标识码:A 文章编号:1672-3791(2014)04(c)-0026-02

二次文献共建共享网络服务平台(以下简称平台)是《全国报刊索引》编辑部一个网络服务平台,它利用现代化信息技术和服务手段,联合海内外广大图情界同仁,在特色资源、近代文献等珍贵文献抢救和发掘方面合作共建,为广大读者用户提供良好的信息参考和决策咨询服务,也为海内外研究国学的人士获取信息提供更多的便利。目前,《全国报刊索引》编辑部已拥有全文数据库、索引数据库、专题数据库和特色资源数据库四种类型数据库。[1]

在平台的运维工作中,经常会收到服务组提出的技术支持请求。有一次,为了配合数据库产品的推广活动,服务组希望技术部协助为一批试用用户账号开放产品试用权限。

平台的文献数据库产品结构如图1所示,分为三层:产品大类(如全文库、索引库等)、产品类(如晚清期刊全文数据库(1833~1911)、民国时期期刊全文数据库(1911~1949)等)、产品(如遐迩贯珍、点石斋画报等)。这次收到的要求是,按不同需要分配产品权限:如单个产品的试用、单个产品类的试用。

按照惯例,类似这种临时性的数据处理请求,以SQL存储过程的方式来完成数据处理的相关任务,再根据实际需要,评估是否需要将该功能加到平台应用中。

1 单个产品的试用权限

这里要做的是为每一个试用账号在产品试用表中添加一条记录,由于需要对试用账号这个查询结果集进行逐行处理,因此,需要使用一个游标来实现,具体如下:

……

DECLARE @trid INT

DECLARE @cp INT

DECLARE usr CURSOR FOR

SELECT

trial_id

FROM trialusr

OPEN usr

FETCH NEXT FROM usr INTO @trid

WHILE @@fetch_status = 0

BEGIN

SET @cp = X /* X为任意数字 */

BEGIN TRANSACTION;

INSERT INTO trialcp(trial_id,cp,start,end)

VALUES(@trid,@cp,GETDATE(),(GETDATE()+7))

COMMIT;

FETCH NEXT FROM usr INTO @trid

END

CLOSE usr

DEALLOCATE usr

……

2 单个产品类的试用权限

在这个需求中,有2个结果集,一个是试用账号,另一个是产品类中的产品id,并且两者都需要进行逐行处理,以实现一对一的关系,因此考虑使用2个游标,并且嵌套使用,具体如下:

……

DECLARE @trid INT

DECLARE @cpl varchar(50)

DECLARE @cp INT

SET @cpl=捪挚饕?1950~)?

DECLARE usr CURSOR FOR

SELECT

trial_id

FROM trialusr

OPEN usr

FETCH NEXT FROM usr INTO @trid

WHILE @@fetch_status = 0

BEGIN

BEGIN

DECLARE cur_cp CURSOR FOR

SELECT cpid

FROM cplist

WHERE cpl = @cpl

OPEN cur_cp

FETCH NEXT FROM cur_cp INTO @cp

WHILE @@fetch_status = 0

BEGIN

BEGIN TRANSACTION;

INSERT INTO trialcp(trial_id,cp,start,end)

VALUES(@trid,@cp,GETDATE(),(GETDATE()+7))

COMMIT;

FETCH NEXT FROM cur_cp INTO @cp

END

CLOSE cur_cp

DEALLOCATE cur_cp

FETCH NEXT FROM usr INTO @trid

END

CLOSE usr

DEALLOCATE usr

……

以上,是根据服务组提出的技术支持需求,形成的解决方案,在测试数据库中测试及调试后,证实该方案可行,并准确实现了服务组的要求。

3 结语

关系数据库中的操作会对整个行集起作用。由SELECT语句返回的行集包括满足该语句的WHERE子句中条件的所有行。这种由语句返回的完整行集称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。[2]

本次技术支持任务中,尝试了通过游标的使用,来实现批量数据的逐行处理。在数据处理的工作中,经常会遇到类似对数据集进行逐行处理的任务,希望本实例,可以为SQL的初学者提供参考。

参考文献

[1] 《全国报刊索引》二次文献共建共享网络服务平台数据库资源介绍[EB/OL].http://www.cnbksy.com/shlib_tsdc/product/list.do.

[2] MSDN—Transact-SQL 参考:游标(数据库引擎)[EB/OL].http://msdn.microsoft.com/zh-cn/library/ms191179(v=sql.105).aspx.endprint

摘 要:关系数据库中的操作会对整个行集起作用,应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。本文通过一个实例,介绍了SQL存储过程中游标的使用。

关键词:SQL游标 游标嵌套 试用权限

中图分类号:TP311 文献标识码:A 文章编号:1672-3791(2014)04(c)-0026-02

二次文献共建共享网络服务平台(以下简称平台)是《全国报刊索引》编辑部一个网络服务平台,它利用现代化信息技术和服务手段,联合海内外广大图情界同仁,在特色资源、近代文献等珍贵文献抢救和发掘方面合作共建,为广大读者用户提供良好的信息参考和决策咨询服务,也为海内外研究国学的人士获取信息提供更多的便利。目前,《全国报刊索引》编辑部已拥有全文数据库、索引数据库、专题数据库和特色资源数据库四种类型数据库。[1]

在平台的运维工作中,经常会收到服务组提出的技术支持请求。有一次,为了配合数据库产品的推广活动,服务组希望技术部协助为一批试用用户账号开放产品试用权限。

平台的文献数据库产品结构如图1所示,分为三层:产品大类(如全文库、索引库等)、产品类(如晚清期刊全文数据库(1833~1911)、民国时期期刊全文数据库(1911~1949)等)、产品(如遐迩贯珍、点石斋画报等)。这次收到的要求是,按不同需要分配产品权限:如单个产品的试用、单个产品类的试用。

按照惯例,类似这种临时性的数据处理请求,以SQL存储过程的方式来完成数据处理的相关任务,再根据实际需要,评估是否需要将该功能加到平台应用中。

1 单个产品的试用权限

这里要做的是为每一个试用账号在产品试用表中添加一条记录,由于需要对试用账号这个查询结果集进行逐行处理,因此,需要使用一个游标来实现,具体如下:

……

DECLARE @trid INT

DECLARE @cp INT

DECLARE usr CURSOR FOR

SELECT

trial_id

FROM trialusr

OPEN usr

FETCH NEXT FROM usr INTO @trid

WHILE @@fetch_status = 0

BEGIN

SET @cp = X /* X为任意数字 */

BEGIN TRANSACTION;

INSERT INTO trialcp(trial_id,cp,start,end)

VALUES(@trid,@cp,GETDATE(),(GETDATE()+7))

COMMIT;

FETCH NEXT FROM usr INTO @trid

END

CLOSE usr

DEALLOCATE usr

……

2 单个产品类的试用权限

在这个需求中,有2个结果集,一个是试用账号,另一个是产品类中的产品id,并且两者都需要进行逐行处理,以实现一对一的关系,因此考虑使用2个游标,并且嵌套使用,具体如下:

……

DECLARE @trid INT

DECLARE @cpl varchar(50)

DECLARE @cp INT

SET @cpl=捪挚饕?1950~)?

DECLARE usr CURSOR FOR

SELECT

trial_id

FROM trialusr

OPEN usr

FETCH NEXT FROM usr INTO @trid

WHILE @@fetch_status = 0

BEGIN

BEGIN

DECLARE cur_cp CURSOR FOR

SELECT cpid

FROM cplist

WHERE cpl = @cpl

OPEN cur_cp

FETCH NEXT FROM cur_cp INTO @cp

WHILE @@fetch_status = 0

BEGIN

BEGIN TRANSACTION;

INSERT INTO trialcp(trial_id,cp,start,end)

VALUES(@trid,@cp,GETDATE(),(GETDATE()+7))

COMMIT;

FETCH NEXT FROM cur_cp INTO @cp

END

CLOSE cur_cp

DEALLOCATE cur_cp

FETCH NEXT FROM usr INTO @trid

END

CLOSE usr

DEALLOCATE usr

……

以上,是根据服务组提出的技术支持需求,形成的解决方案,在测试数据库中测试及调试后,证实该方案可行,并准确实现了服务组的要求。

3 结语

关系数据库中的操作会对整个行集起作用。由SELECT语句返回的行集包括满足该语句的WHERE子句中条件的所有行。这种由语句返回的完整行集称为结果集。应用程序,特别是交互式联机应用程序,并不总能将整个结果集作为一个单元来有效地处理。这些应用程序需要一种机制以便每次处理一行或一部分行。游标就是提供这种机制的对结果集的一种扩展。[2]

本次技术支持任务中,尝试了通过游标的使用,来实现批量数据的逐行处理。在数据处理的工作中,经常会遇到类似对数据集进行逐行处理的任务,希望本实例,可以为SQL的初学者提供参考。

参考文献

[1] 《全国报刊索引》二次文献共建共享网络服务平台数据库资源介绍[EB/OL].http://www.cnbksy.com/shlib_tsdc/product/list.do.

[2] MSDN—Transact-SQL 参考:游标(数据库引擎)[EB/OL].http://msdn.microsoft.com/zh-cn/library/ms191179(v=sql.105).aspx.endprint