T-SQL 游标名称的作用域
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 cursor 为 true,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 游标名称的作用域相关推荐
- SQL游标(cursor)详细说明及内部循环使用示例
游标 游标(cursor)是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果.每个游标区都有一个名字,用户可以用SQL语句逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理. 游标是处理 ...
- SQL -- 游标(详细)
文章目录 一 .概述 1-1 游标基本概念 1-2 游标的实现功能及使用步骤 二.语法 T-SQL 1-1 声明游标 1-2 打开游标 1-3 读取游标 1-4 关闭游标 1-5 删除游标 三. 创建 ...
- oracle学习笔记(十八) PL/SQL 游标
游标 说明 查询结果的光标,相当于java中的一个迭代器,方便遍历操作 可使用的属性 %FOUND SQL语句查询或影响了一行或多行时为 TRUE.如:mycursor%FOUND %NOTFOUND ...
- SQL游标原理和使用方法(转)
SQL游标原理和使用方法 在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT INSERT 语句.但是我们常常会遇到这样情况,即从某一结果集中逐一地读取一条记 ...
- SQL游标使用——格式、实例、嵌套
在sql语句中,如果要实现诸如for循环一样的功能就会用到游标,但游标一定要慎用,因为使用游标对数据库性能有关很大的影响. 一.游标的一般格式: DECLARE 游标名称 CURSOR FOR SEL ...
- SQL游标——PL/SQL教程(三)
SQL游标 /* 在执行执行增删改查语句的时候,Oracle都会开辟一块内存空间, 用来暂时存放收到SQL语句影响的数据. 这块内存空间就被称为游标区域,我们可以借助于游标来分析这些受到影响的数据 * ...
- PL/SQL 游标
本随笔不是原创,只是学习笔记,用于加深记忆,原创地址PL/SQL --> 游标 一.游标的相关概念和特性 1.定义: 映射到结果集中的某一行的特定位置,类似与C语言中的指针.即通过游标方式定位到 ...
- SQL游标的使用与语法
2019独角兽企业重金招聘Python工程师标准>>> 以[master].[dbo].[spt_values] 这个表为例子 === declare @name nvarchar( ...
- sql游标 while_用SQL Server中的排名函数替换SQL While循环和游标,以提高查询性能
sql游标 while SQL While loop and cursor are the most common approach to repeat a statement on conditio ...
最新文章
- 地表车神争霸赛,且看第16届大学生智能汽车竞赛
- 如何检查变量的类型是否为字符串?
- PHP使用CURL案例
- GDCM:DICOM文件转储飞利浦ECHO的测试程序
- OpenPitrix 是一款开源多云应用程序管理系统
- 01.analyzer简介及char_filter组件
- java list 接口_Java 集合 List接口
- 图形学教程Lecture 13: RayTracing1(Whitted-Style Ray Tracing)知识点总结
- java 应用分模块_在Java 11中创建一个简单的模块化应用教程
- [转]常用的CSS命名规则
- 基于LD3320的嵌入式语音识别系统设计
- 将mdf文件转化为excel
- java mina 长连接_长连接神器Mina框架的使用
- 计算机函数的应用知识点总结,计算机应用 常用函数的使用 常用函数的使用.pptx...
- 2021年王道数据结构课后题
- 赶在秃之前肝出一款小游戏
- proftpd ldap mysql_安装proftpd+ldap报错
- 【路科V0】systemVerilog基础11——随机变量
- wordpress配置菜单栏
- 在c语言如何对拨码开关编程,拨码开关控制实验
热门文章
- php和python web开发-php与python谁更适合web开发?为什么?
- php和python哪个用了开发web好-php与python谁更适合web开发?为什么?
- python while循环语句-Python中的while循环语句怎么用?
- python画不出来图是什么原因-完美解决ARIMA模型中plot_acf画不出图的问题
- python基础教程第二版和第三版哪个好-最好的Python入门教材是哪本?
- python语言的理解-初学Python语言者必须理解的下划线
- python怎么安装到d盘-python必须装在c盘吗
- python官网 中文版 新闻-新闻主页 - python兵者 - 博客园
- 以下哪个不是python中的关键字-以下不是python中的关键字
- python中x=x+1的读法-python中a=a+1与a+=1的区别