Transact-SQL 游标名称的作用域

Microsoft® SQL Server™ 2000 支持 DECLARE CURSOR 语句上的 GLOBAL 和 LOCAL 关键字以定义游标名称的作用域。GLOBAL 指定游标名称对连接是全局性的。LOCAL 指定游标名称对含有 DECLARE CURSOR 语句的存储过程、触发器或批处理是局部性的。

在 Microsoft® SQL Server™ 7.0 版之前的版本中,Transact-SQL 游标的名称对连接而言是全局的。可以执行一个创建游标的存储过程,然后调用另一个存储过程从此游标中提取行:

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 /* DECLARES and OPENS SampleCrsr. */
GO
EXEC ReadCrsr /* Fetches the rows from SampleCrsr. */
GO
CLOSE SampleCrsr
GO
DEALLOCATE SampleCrsr
GO

局部游标为存储过程和触发器中执行的游标提供了重要的保护作用。全局游标可以在声明它们的存储过程或触发器的外部被引用。因此,存储过程或触发器的外部语句可能会在无意中更改它们。因为不能在存储过程以外引用局部游标,因此局部游标比全局游标更安全,除非故意将局部游标作为游标输出参数返回调用方。

因为可以在存储过程或触发器的外部引用全局游标,所以全局游标可能会在无意中影响其它语句。例如,在存储过程中创建了一个名为 xyz 的全局游标,在存储过程结束时此游标是打开的。当此存储过程完成后若要使用 xyz 来声明另一个全局游标,则会因为使用重复的名称错误而导致失败。

全局游标和局部游标有各自的名称空间,因此可以同时有相同名称的全局游标和局部游标。接受游标命名参数的Transact-SQL 语句也支持 GLOBAL 关键字来标识名称的作用域。如果没有指定 GLOBAL,且在游标名称参数中同时有指定了此名称的全局游标和局部游标,则引用此局部游标。

如果 LOCAL和 GLOBAL 都没有指定,则数据库选项default to local cursor 控制由 DECLARE CURSOR 语句使用的默认值。如果 default to local cursortrue,Transact-SQL 游标默认为是局部的。如果此选项为 false,Transact-SQL 游标默认为是全局游标。在 SQL Server 2000版中,default to local cursors 选项默认为 FALSE,以便与 SQL Server 早期版本中的内容匹配。

使用 DECLARE 和 OPEN 局部游标的存储过程可以将游标传递出去以供要求调用的存储过程、触发器或批处理使用。这可以通过使用由新的 CURSOR VARYING 数据类型定义的 OUTPUT 参数来实现。游标变量只能用作 OUTPUT 参数。不能将它们用于输入参数。当存储过程完成时游标必须是打开的,以便将游标返回 OUTPUT 参数。也可以通过新的 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
/* Allocate a cursor variable. */
DECLARE @CrsrVar CURSOR
/* Execute the procedure created earlier to fill
the variable. */
EXEC OpenCrsr @OutCrsr = @CrsrVar OUTPUT
/* Use the variable to fetch the rows from the cursor. */
FETCH NEXT FROM @CrsrVar
WHILE (@@FETCH_STATUS <> -1)
BEGIN
FETCH NEXT FROM @CrsrVar
END
CLOSE @CrsrVar
DEALLOCATE @CrsrVar
GO

数据库 API 不支持存储过程中的游标输出参数。不能直接从数据库 API 函数执行包含游标输出参数的存储过程。而只能从另一个存储过程、触发器、Transact-SQL 批处理或脚本执行这些存储过程。

只有在明确释放时或关闭连接时 GLOBAL 游标才可用。创建 LOCAL 游标的存储过程、触发器或批处理终止时将隐性释放 LOCAL 游标,除非游标已作为参数返回。当调用过程的代码中引用游标的参数或变量超出作用域时,将隐性地释放 LOCAL 游标。

转载

转载于:https://www.cnblogs.com/haiyang1985/archive/2009/01/13/1374944.html

T-SQL 游标名称的作用域相关推荐

  1. SQL游标(cursor)详细说明及内部循环使用示例

    游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 游标是处理 ...

  2. SQL -- 游标(详细)

    文章目录 一 .概述 1-1 游标基本概念 1-2 游标的实现功能及使用步骤 二.语法 T-SQL 1-1 声明游标 1-2 打开游标 1-3 读取游标 1-4 关闭游标 1-5 删除游标 三. 创建 ...

  3. oracle学习笔记(十八) PL/SQL 游标

    游标 说明 查询结果的光标,相当于java中的一个迭代器,方便遍历操作 可使用的属性 %FOUND SQL语句查询或影响了一行或多行时为 TRUE.如:mycursor%FOUND %NOTFOUND ...

  4. SQL游标原理和使用方法(转)

    SQL游标原理和使用方法 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记 ...

  5. SQL游标使用——格式、实例、嵌套

    在sql语句中,如果要实现诸如for循环一样的功能就会用到游标,但游标一定要慎用,因为使用游标对数据库性能有关很大的影响. 一.游标的一般格式: DECLARE 游标名称 CURSOR FOR SEL ...

  6. SQL游标——PL/SQL教程(三)

    SQL游标 /* 在执行执行增删改查语句的时候,Oracle都会开辟一块内存空间, 用来暂时存放收到SQL语句影响的数据. 这块内存空间就被称为游标区域,我们可以借助于游标来分析这些受到影响的数据 * ...

  7. PL/SQL 游标

    本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...

  8. SQL游标的使用与语法

    2019独角兽企业重金招聘Python工程师标准>>> 以[master].[dbo].[spt_values] 这个表为例子 === declare @name nvarchar( ...

  9. sql游标 while_用SQL Server中的排名函数替换SQL While循环和游标,以提高查询性能

    sql游标 while SQL While loop and cursor are the most common approach to repeat a statement on conditio ...

最新文章

  1. 地表车神争霸赛,且看第16届大学生智能汽车竞赛
  2. 如何检查变量的类型是否为字符串?
  3. PHP使用CURL案例
  4. GDCM:DICOM文件转储飞利浦ECHO的测试程序
  5. OpenPitrix 是一款开源多云应用程序管理系统
  6. 01.analyzer简介及char_filter组件
  7. java list 接口_Java 集合 List接口
  8. 图形学教程Lecture 13: RayTracing1(Whitted-Style Ray Tracing)知识点总结
  9. java 应用分模块_在Java 11中创建一个简单的模块化应用教程
  10. [转]常用的CSS命名规则
  11. 基于LD3320的嵌入式语音识别系统设计
  12. 将mdf文件转化为excel
  13. java mina 长连接_长连接神器Mina框架的使用
  14. 计算机函数的应用知识点总结,计算机应用 常用函数的使用 常用函数的使用.pptx...
  15. 2021年王道数据结构课后题
  16. 赶在秃之前肝出一款小游戏
  17. proftpd ldap mysql_安装proftpd+ldap报错
  18. 【路科V0】systemVerilog基础11——随机变量
  19. wordpress配置菜单栏
  20. 在c语言如何对拨码开关编程,拨码开关控制实验

热门文章

  1. php和python web开发-php与python谁更适合web开发?为什么?
  2. php和python哪个用了开发web好-php与python谁更适合web开发?为什么?
  3. python while循环语句-Python中的while循环语句怎么用?
  4. python画不出来图是什么原因-完美解决ARIMA模型中plot_acf画不出图的问题
  5. python基础教程第二版和第三版哪个好-最好的Python入门教材是哪本?
  6. python语言的理解-初学Python语言者必须理解的下划线
  7. python怎么安装到d盘-python必须装在c盘吗
  8. python官网 中文版 新闻-新闻主页 - python兵者 - 博客园
  9. 以下哪个不是python中的关键字-以下不是python中的关键字
  10. python中x=x+1的读法-python中a=a+1与a+=1的区别