一个SQL游标的应用实例.docVIP

  • 7
  • 0
  • 约 5页
  • 2016-09-10 发布于北京
  • 举报
一个SQL游标的应用实例.doc

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

文档评论(0)

1亿VIP精品文档

相关文档