Heim  >  Artikel  >  Datenbank  >  Transact-SQL中游标名的作用域_MySQL

Transact-SQL中游标名的作用域_MySQL

WBOY
WBOYOriginal
2016-06-01 13:56:47915Durchsuche

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 批处理,脚本调用执行。
全局游标在没有被显式释放或连接关闭前一直有效。局部游标默认将在存储过程,触发器,批处理结束时释放,除非它被作为输出参数输出。那个局部游标也将在引用它的存储工程结束时被释放。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn