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