Transact-SQL中游标名的作用域

来源:互联网 发布:剑灵读图慢怎么优化 编辑:程序博客网 时间:2024/06/17 15:01
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

        Microsoft2000支持关键字GLOBAL和LOCAL用于DECLARECURSOR语句中游标名作用域的定义。GLOBAL指定游标名在一个连接中是全局的。LOCAL指定游标名在存储过程,触发器,包含DECLARECURSOR的批处理语句中是局部的。
        MicrosoftSQLServer7.0版本以前,在一个连接中,游标名都是全局的。你必须先执行一个用于创建游标的存储过程,然后再执行另外一个从该游标中读取记录的存储过程。如:
USEpubs
GO
CREATEPROCEDUREOpenCrsrAS

DECLARESampleCrsrCURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKE'S%'

OPENSampleCrsr
GO

CREATEPROCEDUREReadCrsrAS
FETCHNEXTFROMSampleCrsr
WHILE(@@FETCH_STATUS<>-1)
BEGIN
  FETCHNEXTFROMSampleCrsr
END
GO

EXECOpenCrsr/*声明并打开游标SampleCrsr.*/
GO
EXECReadCrsr/*从游标SampleCrsr中读取记录.*/
GO
CLOSESampleCrsr
GO
DEALLOCATESampleCrsr
GO

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

SET@OutCrsr=CURSORFOR
SELECTau_lname
FROMauthors
WHEREau_lnameLIKE'S%'

OPEN@OutCrsr
GO

/*声明局部游标.*/
DECLARE@CrsrVarCURSOR

/*将先前的游标赋给局部变量.*/
EXECOpenCrsr@OutCrsr=@CrsrVarOUTPUT

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

CLOSE@CrsrVar

DEALLOCATE@CrsrVar
GO
        数据库API并不支持输出游标参数的存储过程。一个包含输出游标参数的存储过程不能直接被数据库API执行。这些存储过程之可以被其他的存储过程,触发器,Transact-SQL批处理,脚本调用执行。共2页  1 
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
<script type="text/javascript"><!--google_ad_client = "pub-2947489232296736";/* 160x600, 创建于 08-4-23MSDN */google_ad_slot = "4367022601";google_ad_width = 160;google_ad_height = 600;//--></script><script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
原创粉丝点击