`
zhuxinzx
  • 浏览: 293741 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

DECLARE CURSOR的使用

阅读更多
DECLARE CURSOR
DECLARE @license_id numeric(9)

DECLARE license_cursor CURSOR FOR --建立游标使用结果集

 select license_id from license where license_id = 3

OPEN license_cursor --填充结果集

FETCH NEXT FROM license_cursor into @license_id --从结果集返回行

CLOSE license_cursor --释放与游标关联的结果集

DEALLOCATE license_cursor --释放游标所占资源

@@FETCH_STATUS

0表示FETCH成功,

1表示FETCH失败

NEXT 返回紧跟当前行之后的结果行,并且当前行递增为结果行。如果 FETCH NEXT 为对游标的第一次提取操作,则返回结果集中的第一行。

NEXT 为默认的游标提取选项。

PRIOR 返回紧临当前行前面的结果行,并且当前行递减为结果行。如果 FETCH PRIOR 为对游标的第一次提取操作,则没有行返回并且游标置于第一行之前

FIRST 返回游标中的第一行并将其作为当前行。

LAST 返回游标中的最后一行并将其作为当前行。

INTO @variable_name[,...n] 允许将提取操作的列数据放到局部变量中。列表中的各个变量从左到右与游标结果集中的相应列相关联。各变量的数据类型必须与相应的结果列的数据类型匹配或是结果列数据类型所支持的隐性转换。变量的数目必须与游标选择列表中的列的数目一致。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Transact-SQL 参考
DECLARE CURSOR
定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。DECLARE CURSOR 接受基于 SQL-92 标准的语法和使用一组 Transact-SQL 扩展的语法。

SQL-92 语法
DECLARE cursor_name [ INSENSITIVE ] [ SCROLL ] CURSOR
FOR select_statement
[ FOR { READ ONLY | UPDATE [ OF column_name [ ,...n ] ] } ]

Transact-SQL 扩展语法
DECLARE cursor_name CURSOR
[ LOCAL | GLOBAL ]
[ FORWARD_ONLY | SCROLL ]
[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ]
[ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ]
[ TYPE_WARNING ]
FOR select_statement
[ FOR UPDATE [ OF column_name [ ,...n ] ] ]

SQL-92 参数
cursor_name

是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。

INSENSITIVE

定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。使用 SQL-92 语法时,如果省略 INSENSITIVE,(任何用户)对基表提交的删除和更新都反映在后面的提取中。

SCROLL

指定所有的提取选项(FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)均可用。如果在 SQL-92 DECLARE CURSOR 中未指定 SCROLL,则 NEXT 是唯一支持的提取选项。如果指定 SCROLL,则不能也指定 FAST_FORWARD。

select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果 select_statement 中的子句与所请求的游标类型的功能发生冲突,则 Microsoft® SQL Server™ 隐性地将游标转换为另一种类型。有关更多信息,请参见隐性游标转换。

READ ONLY

Prevents updates made through this cursor.在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果指定 OF column_name [,...n] 参数,则只允许修改所列出的列。如果在 UPDATE 中未指定列的列表,则可以更新所有列。

Transact-SQL 扩展参数
cursor_name

是所定义的 Transact-SQL 服务器游标名称。cursor_name 必须遵从标识符规则。有关标识符规则的更多信息,请参见使用标识符。

LOCAL

指定该游标的作用域对在其中创建它的批处理、存储过程或触发器是局部的。该游标名称仅在这个作用域内有效。在批处理、存储过程、触发器或存储过程 OUTPUT 参数中,该游标可由局部游标变量引用。OUTPUT 参数用于将局部游标传递回调用批处理、存储过程或触发器,它们可在存储过程终止后给游标变量指派参数使其引用游标。除非 OUTPUT 参数将游标传递回来,否则游标将在批处理、存储过程或触发器终止时隐性释放。如果 OUTPUT 参数将游标传递回来,游标在最后引用它的变量释放或离开作用域时释放。

GLOBAL

指定该游标的作用域对连接是全局的。在由连接执行的任何存储过程或批处理中,都可以引用该游标名称。该游标仅在脱接时隐性释放。


说明  如果 GLOBAL 和 LOCAL 参数都未指定,则默认值由 default to local cursor 数据库选项的设置控制。在 SQL Server 7.0 版中,该选项默认为 FALSE 以与 SQL Server 早期版本相匹配,在 SQL Server 早期版本中所有游标都是全局的。该选项的默认值在以后的 SQL Server 版本中可能会更改。有关更多信息,请参见设置数据库选项。


FORWARD_ONLY

指定游标只能从第一行滚动到最后一行。FETCH NEXT 是唯一受支持的提取选项。如果在指定 FORWARD_ONLY 时不指定 STATIC、KEYSET 和 DYNAMIC 关键字,则游标作为 DYNAMIC 游标进行操作。如果 FORWARD_ONLY 和 SCROLL 均未指定,除非指定 STATIC、KEYSET 或 DYNAMIC 关键字,否则默认为 FORWARD_ONLY。STATIC、KEYSET 和 DYNAMIC 游标默认为 SCROLL。与 ODBC 和 ADO这类数据库 API 不同,STATIC、KEYSET 和 DYNAMIC Transact-SQL 游标支持 FORWARD_ONLY。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。

STATIC

定义一个游标,以创建将由该游标使用的数据的临时复本。对游标的所有请求都从 tempdb 中的该临时表中得到应答;因此,在对该游标进行提取操作时返回的数据中不反映对基表所做的修改,并且该游标不允许修改。

KEYSET

指定当游标打开时,游标中行的成员资格和顺序已经固定。对行进行唯一标识的键集内置在 tempdb 内一个称为 keyset 的表中。对基表中的非键值所做的更改(由游标所有者更改或由其它用户提交)在用户滚动游标时是可视的。其他用户进行的插入是不可视的(不能通过 Transact-SQL 服务器游标进行插入)。如果某行已删除,则对该行的提取操作将返回 @@FETCH_STATUS 值 -2。从游标外更新键值类似于删除旧行后接着插入新行的操作。含有新值的行不可视,对含有旧值的行的提取操作将返回 @@FETCH_STATUS 值 -2。如果通过指定 WHERE CURRENT OF 子句用游标完成更新,则新值可视。

DYNAMIC

定义一个游标,以反映在滚动游标时对结果集内的行所做的所有数据更改。行的数据值、顺序和成员在每次提取时都会更改。动态游标不支持 ABSOLUTE 提取选项。

FAST_FORWARD

指定启用了性能优化的 FORWARD_ONLY、READ_ONLY 游标。如果指定 FAST_FORWARD,则不能也指定 SCROLL 或 FOR_UPDATE。FAST_FORWARD 和 FORWARD_ONLY 是互斥的;如果指定一个,则不能指定另一个。

READ_ONLY

禁止通过该游标进行更新。在 UPDATE 或 DELETE 语句的 WHERE CURRENT OF 子句中不能引用游标。该选项替代要更新的游标的默认功能。

SCROLL_LOCKS

指定确保通过游标完成的定位更新或定位删除可以成功。当将行读入游标以确保它们可用于以后的修改时,Microsoft® SQL Server™ 会锁定这些行。如果还指定了 FAST_FORWARD,则不能指定 SCROLL_LOCKS。

OPTIMISTIC

指定如果行自从被读入游标以来已得到更新,则通过游标进行的定位更新或定位删除不成功。当将行读入游标时 SQL Server 不锁定行。相反,SQL Server 使用 timestamp 列值的比较,或者如果表没有 timestamp 列则使用校验值,以确定将行读入游标后是否已修改该行。如果已修改该行,尝试进行的定位更新或定位删除将失败。如果还指定了 FAST_FORWARD,则不能指定 OPTIMISTIC。

TYPE_WARNING

指定如果游标从所请求的类型隐性转换为另一种类型,则给客户端发送警告消息。

select_statement

是定义游标结果集的标准 SELECT 语句。在游标声明的 select_statement 内不允许使用关键字 COMPUTE、COMPUTE BY、FOR BROWSE 和 INTO。

如果 select_statement 内的子句与所请求的游标类型冲突,SQL Server 将游标隐性转换成另一种类型。有关更多信息,请参见隐性游标转换。

UPDATE [OF column_name [,...n]]

定义游标内可更新的列。如果提供了 OF column_name [,...n],则只允许修改列出的列。如果在 UPDATE 中未指定列的列表,除非指定了 READ_ONLY 并发选项,否则所有列均可更新。

注释
DECLARE CURSOR 定义 Transact-SQL 服务器游标的特性,例如游标的滚动行为和用于生成游标对其进行操作的结果集的查询。OPEN 语句填充结果集,FETCH 从结果集返回行。CLOSE 语句释放与游标关联的当前结果集。DEALLOCATE 语句释放游标所使用的资源。

DECLARE CURSOR 语句的第一种格式使用 SQL-92 语法声明游标行为。DECLARE CURSOR 的第二种格式使用 Transact-SQL 扩展,使您得以使用在 ODBC、ADO 和 DB-Library的数据库 API 游标函数中的相同游标类型定义游标。

不能混淆这两种格式。如果在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE 关键字,则不能在 CURSOR 和 FOR select_statement 关键字之间使用任何关键字。如果在 CURSOR 和 FOR select_statement 关键字之间指定任何关键字,则不能在 CURSOR 关键字的前面指定 SCROLL 或 INSENSITIVE。

如果使用 Transact-SQL 语法的 DECLARE CURSOR 不指定 READ_ONLY、OPTIMISTIC 或 SCROLL_LOCKS,则默认设置如下:

如果 SELECT 语句不支持更新(权限不够,访问的远程表不支持更新,等等),则游标是 READ_ONLY。


STATIC 和FAST_FORWARD 游标默认为 READ_ONLY。


DYNAMIC 和 KEYSET 游标默认为 OPTIMISTIC。
游标名称只能由其它 Transact-SQL 语句引用,不能由数据库 API 函数引用。例如,在声明游标后,不能从 OLE DB、ODBC、ADO 或 DB-Library 函数或方法引用游标名称。游标行不能通过 API 提取函数或方法提取,而只能由 Transact-SQL FETCH 语句提取。

在声明游标后,可使用下列系统存储过程确定游标的特性。

系统存储过程 描述
sp_cursor_list 返回当前在连接上可视的游标列表及其特性。
sp_describe_cursor 描述游标特性,比如是只进游标还是滚动游标。
sp_describe_cursor_columns 描述游标结果集中的列的特性。
sp_describe_cursor_tables 描述游标所访问的基表。


变量可作为声明游标的 select_statement 的一部分使用。然而,在游标声明之后对那些变量的更改将不会对游标的操作产生影响。

权限
默认情况下,将 DECLARE CURSOR 权限授予对游标中所使用的视图、表和列有 SELECT 权限的任何用户。

示例
A. 使用简单游标和语法
打开该游标时所生成的结果集包括 pubs 数据库的 authors 表中的所有行和列。可以更新该游标,对该游标所做的所有更新和删除均在提取中表现出来。因为没指定 SCROLL 选项,FETCH NEXT 是唯一可用的提取选项。

DECLARE authors_cursor CURSOR
   FOR SELECT * FROM authors
OPEN authors_cursor
FETCH NEXT FROM authors_cursor

B. 使用嵌套游标生成报表输出
下例显示如何嵌套游标以生成复杂的报表。为每个作者声明内部游标。

SET NOCOUNT ON

DECLARE @au_id varchar(11), @au_fname varchar(20), @au_lname varchar(40),
   @message varchar(80), @title varchar(80)

PRINT "-------- Utah Authors report --------"

DECLARE authors_cursor CURSOR FOR
SELECT au_id, au_fname, au_lname
FROM authors
WHERE state = "UT"
ORDER BY au_id

OPEN authors_cursor

FETCH NEXT FROM authors_cursor
INTO @au_id, @au_fname, @au_lname

WHILE @@FETCH_STATUS = 0
BEGIN
   PRINT " "
   SELECT @message = "----- Books by Author: " +
      @au_fname + " " + @au_lname

   PRINT @message

   -- Declare an inner cursor based  
   -- on au_id from the outer cursor.

   DECLARE titles_cursor CURSOR FOR
   SELECT t.title
   FROM titleauthor ta, titles t
   WHERE ta.title_id = t.title_id AND
   ta.au_id = @au_id   -- Variable value from the outer cursor

   OPEN titles_cursor
   FETCH NEXT FROM titles_cursor INTO @title

   IF @@FETCH_STATUS <> 0
      PRINT "         <<No Books>>"    

   WHILE @@FETCH_STATUS = 0
   BEGIN
     
      SELECT @message = "         " + @title
      PRINT @message
      FETCH NEXT FROM titles_cursor INTO @title
  
   END

   CLOSE titles_cursor
   DEALLOCATE titles_cursor
  
   -- Get the next author.
   FETCH NEXT FROM authors_cursor
   INTO @au_id, @au_fname, @au_lname
END

CLOSE authors_cursor
DEALLOCATE authors_cursor
GO

-------- Utah Authors report --------

----- Books by Author: Anne Ringer
         The Gourmet Microwave
         Is Anger the Enemy?

----- Books by Author: Albert Ringer
         Is Anger the Enemy?
         Life Without Fear

分享到:
评论

相关推荐

    oracle笔记游标的使用

    oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!

    oracle-cursor.rar_cursor_oracle_oracle cursor

    - 声明:在PL/SQL块中,使用DECLARE关键字声明游标,指定游标的SQL查询语句。 ```sql DECLARE cursor_name CURSOR FOR SELECT column1, column2 FROM table_name WHERE condition; ``` - 打开:使用OPEN语句打开...

    oracle CURSOR例子

    ### Oracle Cursor 示例详解 在Oracle数据库管理中,游标(Cursor)是一种强大的工具,用于处理SQL语句返回的结果集中的数据。游标允许程序逐一访问结果集中的每一行记录,并进行复杂的逻辑处理。本文将通过几个...

    Oracle数据库中的Cursor介绍

    - 使用`CURSOR`关键字声明游标并指定对应的`SELECT`语句。 - 例如:`CURSOR myCur IS SELECT empno, ename, sal FROM emp;` 2. **打开游标**: - 使用`OPEN`语句打开游标并执行`SELECT`语句。 - 例如:`OPEN ...

    Oracle JOB,procedure,cursor 的使用

    本篇文章将深入探讨Oracle中的JOB、PROCEDURE(存储过程)和CURSOR(游标)的使用,这些是Oracle数据库开发中的核心概念。 首先,我们来看Oracle中的JOB。JOB是一种调度工具,允许用户在特定时间或间隔执行数据库...

    Oracle中Cursor介绍[归类].pdf

    - 定义游标:`DECLARE cursor_name CURSOR FOR select_statement;` - 打开游标:`OPEN cursor_name;` - 操作数据:`FETCH cursor_name INTO variable_list;` - 关闭游标:`CLOSE cursor_name;` 显式游标也有...

    oracle 临时表使用例子并用CURSOR返回结果集的例子

    本篇文章将深入探讨Oracle临时表的使用,并通过一个使用游标(CURSOR)返回结果集的例子来进一步理解其用法。 首先,让我们了解如何创建Oracle临时表。临时表的创建语法与普通表类似,但我们需要使用`GLOBAL ...

    11-3--游标Cursor1

    DECLARE cursor_name CURSOR FOR SELECT * FROM table_name; ``` 其中,`cursor_name` 是游标的名称,`SELECT * FROM table_name` 是游标所指向的记录集。 打开游标 在 SQL 中,打开游标使用 `OPEN` 语句,例如: ...

    mysql存储过程之游标(DECLARE)原理与用法详解

    DECLARE cursor_name CURSOR FOR SELECT_statement; ``` 需要注意的是,DECLARE语句必须在变量声明之后,且游标必须与SELECT语句关联。接着,使用OPEN语句打开游标: ```sql OPEN cursor_name; ``` 然后,FETCH语句...

    CURSOR 游标的使用

    游标概念 SQL是面向集合的,一条SQL语句可以处理多条记录;...EXEC SQL DECLARE CURSOR FOR ; 只是说明,并没有执行其中的SELECT语 (2)打开游标——OPEN EXEC SQL OPEN ; 打开就是执行其中的SELECT语句

    cursor游标

    1. **声明**:使用DECLARE语句声明游标,指定SQL查询。 2. **打开**:使用OPEN语句打开游标,准备处理查询结果。 3. **提取**:使用FETCH语句获取游标指向的当前行数据,可以将这些值绑定到PL/SQL变量中。 4. **处理...

    plsql.zip_PLSQL Developer_cursor

    最后,**动态引用游标**(Dynamic Ref_Cursor)通常与存储过程和函数结合使用,用于返回结果集。它允许我们在运行时动态构建SQL语句,适用于处理未知结构的结果集。动态引用游标可以返回到调用程序,让调用者能够...

    存储过程详解和实例分析

    1. **使用`DECLARE CURSOR`命令定义**: ```sql DECLARE continue handler for not found BEGIN SET v_notfound = 1; END; DECLARE cursor1 CURSOR WITHHOLD FOR SELECT market_code FROM tb_market_code ...

    Oracle游标使用方法及语法大全

    在 PL/SQL 中,游标的声明使用 CURSOR 关键字,例如: ```sql DECLARE CURSOR c_emp IS SELECT * FROM emp; ``` 这里声明了一个名为 c_emp 的游标,该游标用于查询 emp 表中的所有记录。 二、游标的打开和关闭 ...

    深入SQL Cursor基本用法的详细介绍

    代码如下: table1结构如下 id int name varchar(50) declare @id int declare @name varchar(50) declare cursor1 cursor for –定义游标cursor1 select * from table1 –使用游标的对象(跟据需要填入...

    整理数据库

    DECLARE tables CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' -- Create the table CREATE TABLE #fraglist ( ObjectName CHAR (255), ObjectId INT, ...

    sql游标 cursor

    DECLARE &lt;cursor_name&gt; CURSOR FOR SELECT column_list FROM table_name [WHERE conditions]; ``` 例如,在给定的部分内容中,游标`d_cursor`被声明为: ```sql DECLARE d_cursor CURSOR FOR SELECT IdCardNO ...

    SQL语句\sql 游标总结

    声明游标使用 DECLARE CURSOR 语句。此语句有两种语法声明格式,分别为 SQL 92 标准格式和 SQL Server 扩展(扩展了声明游标的参数)格式。 2.1 SQL-92 语法格式 语法:DECLARE cursor_name [ INSENSITIVE ] [ ...

    oracle-cursor.rar_oracle

    DECLARE cursor_name CURSOR FOR select_statement; variable_name datatype; BEGIN ... END; ``` - **打开**:然后,使用OPEN语句打开游标,准备处理数据。 ```sql OPEN cursor_name; ``` - **提取数据**:使用...

Global site tag (gtag.js) - Google Analytics