转至繁体中文版     | 网站首页 | 文章中心 | 下载中心 | 图片中心 | 笑话频道 | 教程频道 | 会员中心 | 雁过留声 | 
最新公告:     "MinTao学以致用网"欢迎您的光临,你的支持便是我们的动力,欢迎广大网友和各界人士亲临指导,你们的一个小小的建议便是我们发展的开路石!  [MinTao  2007年9月5日]        
您现在的位置: MinTao学以致用网 >> 文章中心 >> 电子课堂 >> 数据库 >> Sql Server >> 文章正文
专题栏目
更多内容
最新推荐 更多内容
相关文章
SQL Server的存储过程调
SQL Server安全性简介
SQL 语法参考手册
MS SQL Sever 7.0 存储引
SQL SERVER和SYBASE
SQL Server 7.0数据库的
VB应用程序访问SQL Serv
将DBF数据库转换成SQL S
拷贝的SQL Server 7数据
浅谈优化SQL Server数据
更多内容
Transact-SQL中游标名的作用域         
Transact-SQL中游标名的作用域
作者:fgwf1 文章来源:不详 点击数: 更新时间:2007-11-14 12:56:09

        Microsoft SQL Server 2000支持关键字GLOBAL和LOCAL用于DECLARE CURSOR 语句中游标名作用域的定义。GLOBAL指定游标名在一个连接中是全局的。LOCAL指定游标名在存储过程,触发器,包含DECLARE CURSOR的批处理语句中是局部的。
        Microsoft SQL Server 7.0版本以前,在一个连接中,游标名都是全局的。你必须先执行一个用于创建游标的存储过程,然后再执行另外一个从该游标中读取记录的存储过程。如:
USE pubs
GO
CREATE PROCEDURE OpenCrsr AS

DECLARE SampleCrsr CURSOR FOR
SELECT au_lname
FROM authors
WHERE au_lname LIKE ''''S%''''

OPEN SampleCrsr
GO

CREATE PROCEDURE ReadCrsr AS
FETCH NEXT FROM SampleCrsr
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM SampleCrsr
END
GO

EXEC OpenCrsr /* 声明并打开游标SampleCrsr. */
GO
EXEC ReadCrsr /* 从游标SampleCrsr中读取记录. */
GO
CLOSE SampleCrsr
GO
DEALLOCATE SampleCrsr
GO

        局部游标在存储过程和触发器中对游标起着重要的保护作用。全局游标能在定义它们的存储过程或触发器外被访问。因此,它们可能在不经意的时候,在存储过程和触发器外被改变。局部游标显得更安全,因为它们不会在存储过程和触发器外被改变,除非特地的通过输出游标参数被传递给调用者。
        因为全局游标可以在存储过程和触发器以外被引用,所以它们可能对其他语句有不可预期的影响。例如:一个存储过程创建一个全局游标xyz,过程运行结束后游标xyz仍然处于打开状态,如果程序其他部分又想声明一个全局游标并命名为xyz,这时,就会发生一个重复定义的错误。
        全局和局部游标具有不同的命名空间,所以,在同一时间可以出现两个具有同样名字的全局和局部游标。Transact-SQL语法支持游标参数,同样也支持使用GLOBAL标识游标的作用域。如果一个游标名同时表示全局游标和局部游标,在没有指定为GLOBAL时,此游标名将引用局部游标。
        数据库选项default to local cursor控制由未指定GLOBAL和LOCAL选项的DECLARE CURSOR语句创建的游标的默认作用域。如果default to local cursor 选项为真,则为局部游标,反之为全局。SQL Server 2000中,default to local cursors 选项默认为false,用于保持与先前版本一致。
        声明并且打开局部游标的存储过程,可以将这些游标传出给调用它的存储过程,触发器和批处理语句。这可以通过一个定义为输出参数的CURSOR VARYING 数据类型实现。当存储过程执行结束时,游标必须打开,用以通过输出参数返回。我们可以用一个定义为CURSOR类型的局部变量引用它。
USE pubs
GO
/* Create a procedure with a cursor output parameter. */
CREATE PROCEDURE OpenCrsr @OutCrsr CURSOR VARYING OUTPUT AS

SET @OutCrsr = CURSOR FOR
SELECT au_lname
FROM authors
WHERE au_lname LIKE ''''S%''''

OPEN @OutCrsr
GO

/* 声明局部游标. */
DECLARE @CrsrVar CURSOR

/* 将先前的游标赋给局部变量. */
EXEC OpenCrsr @OutCrsr = @CrsrVar OUTPUT

/* 利用@CrsrVar去读取记录. */
FETCH NEXT FROM @CrsrVar
WHILE (@@FETCH_STATUS <> -1)
BEGIN
   FETCH NEXT FROM @CrsrVar
END

CLOSE @CrsrVar

DEALLOCATE @CrsrVar
GO
        数据库API并不支持输出游标参数的存储过程。一个包含输出游标参数的存储过程不能直接被数据库API执行。这些存储过程之可以被其他的存储过程,触发器,Transact-SQL 批处理,脚本调用执行。
        全局游标在没有被显式释放或连接关闭前一直有效。局部游标默认将在存储过程,触发器,批处理结束时释放,除非它被作为输出参数输出。那个局部游标也将在引用它的存储工程结束时被释放。

文章录入:mintao    责任编辑:mintao 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007 MinTao学以致用网(www.mintao.net) Inc All Rights Reserved.
    QQ:543098146有事请Q我! QQ:261561092有事请Q我 QQ:179647303有事请Q我 MSN:min906@126.com
    站长:MinTao 信息产业部ICP备案号:鄂ICP备07500065号

    学以致用是我们学习者的至高境界和不懈追求,[MinTao学以致用网]与大家共同学习,共同进步……
    信息产业部备案
    *鄂ICP备07500065号