2023-01-08 12:21:39 发布人:hao333 阅读( 7335)
SQL-SERVER声明游标每一个游标必须有四个组成部分这四个关键部分必须符合下面的顺序;1 DECLARE游标2 OPEN游标3 从一个游标中FETCH信息4 CLOSE或DEALLOCATE游标通常我们使用DECLARE来声明一个游标声明一个游标主要包括以下主要内容:游标名字数据来
SQL-SERVER声明游标
每个游标必须有四个组成部分。这四个关键组件必须符合以下顺序:
1.声明光标
2.打开光标
3.从游标获取信息
4.关闭或释放光标
我们通常使用DECLARE来声明一个游标。声明一个游标主要包括以下主要内容:
光标名称
数据源(表和列)
选择条件
属性(只读或可修改)
其语法格式如下:
声明CURSOR _ name[INSENSITIVE][SCROLL]游标
FOR select_statement
[FOR {只读|更新[列名[,n]]}]
其中包括:
光标名称
指光标的名称。
感觉迟钝的
它表示MS sql server将把游标定义选择的数据记录存储在一个临时表中(在tempdb数据库下建立)。对该游标的所有读取都由临时表来回答。所以基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的变化而变化,也不会通过。
光标来更新基本表。如果不使用保留字,基本表的更新和删除将反映在光标上。
另外需要指出的是,当出现以下情况时,光标会自动设置不敏感选项。
在SELECT语句中使用DISTINCT、GROUP BY和HAVING UNION语句。
使用外部联接;
任何选定的表都没有索引;
将实数值视为所选行。
卷起
表示所有提取操作(如第一个、最后一个、前一个、下一个、相对、绝对)都可用。如果未使用保留字,则只能执行下一个提取操作。可以看出,SCROLL大大增加了数据提取的灵活性,可以随意读取结果集中的任意一行数据记录,而无需再次关闭。
重新打开光标。
select _语句
定义结果集的SELECT语句。应该注意,在游标中不能使用COMPUTE、COMPUTE BY、FOR BROWSE和INTO语句。
只读
指示不允许更新游标中的数据,尽管默认情况下允许更新游标。此外,在UPDATE或DELETE语句的WHERE CURRENT OF子句中,不允许引用此游标。
更新[列名[,…n]]
定义可以在游标中修改的列。如果不指明要更新的列,所有列都将被更新。成功创建游标后,游标名称将成为游标的唯一标识。如果将来在存储过程、触发器或Transact_SQL脚本中使用游标,则必须指定游标名称。
以上是SQL_92的游标语法规则。下面介绍了MS SQL SERVER提供的扩展游标声明语法。通过添加另一个保留字,光标的功能进一步增强。其语法规则是
当地的
仅在游标所在的存储过程、触发器或批处理中定义游标的范围。当创建游标的存储过程执行完毕时,游标将被自动释放。所以我们经常使用存储过程中的保留字输出,将光标传递给存储过程的调用方,这样在存储过程执行后就可以引用光标变量。在这种情况下,光标不会被自动释放,直到最后一个引用该光标的光标被释放。
全球的
游标的范围定义为整个会话层。会话层是指用户的连接时间,包括用户登录SQLSERVER到离开数据库的整个时间。GLOBAL表示游标可以在整个会话层的任何存储过程、触发器或批处理中使用,只有在用户离开数据库时才会自动释放。
注意:如果既没有使用全局选项也没有使用本地选项,SQL SERVER将使用默认的本地游标数据库选项,出于对明显版本的抱歉,该选项通常设置为FALSE。
仅限转发
选项表示只能按照从第一行到最后一行的顺序从游标中提取数据记录,并且此时只能选择FETCH NEXT操作。除非使用了STATIC、KEYSET和DYNAMIC关键字,否则如果没有指定FORWARD_ONLY或SCROLL,那么FORWARD_ONLY将成为默认选项,因为如果使用了STATIC KEYSET和DYNAMIC关键字,它将成为SCROLL cursor。此外,如果使用FORWARD_ONLY,则不能使用FAST_FORWARD。
静电
选项的含义与不敏感选项的含义相同。MS SQL SERVER会将游标定义选择的数据记录存储在一个临时表中(在tempdb数据库下建立)。对该游标的所有读取都由临时表来回答。因此,对基本表的修改并不影响游标中的数据,即游标不会跟随基本表的内容。
和修改,同时不能通过光标更新基本表。
键盘
指出游标打开时,游标中列的顺序是固定的,MS SQL SERVER会在tempdb中建立一个表,这个表是KEYSET KEYSET的键值,可以唯一标识游标中的一行数据。当游标所有者或其他用户修改基本表中的非关键数据时,这种变化可以反映在游标中,因此游标用户或所有者可以通过滚动游标来限制数据。
当另一个用户添加符合定义的游标范围的新数据时,该游标无法读取该数据。因为Transact-SQL server游标不支持INSERT语句。
如果删除了游标中的一行,当游标提取被删除的行时,@@FETCH_STATUS的返回值为-2。@@FETCH_STATUS是一个系统全局变量,用来判断读取游标是否成功。
因为更新操作包括删除原始数据和插入新数据两部分,如果读取原始数据,@@FETCH_STATUS的返回值为-2;新插入的数据无法通过游标读取。但是,如果使用WHERE CURRENT OF子句,新插入的行数据将是可见的。
注意:如果基础表不包含唯一索引或主键,则键集游标将恢复为静态游标。
动态的
指示基础表的更改将反映在游标中。使用该选项将最大程度地确保数据的一致性。但是,与键集和静态游标相比,这种类型的游标需要大量的游标资源。
快进
指示只进只读游标。此选项已针对执行进行了优化。如果定义了SCROLL或FOR_UPDATE选项,则不能定义FAST_FORWARD选项。
滚动锁
指示对游标结果集使用的数据加锁。当数据读入游标时,会出现一个锁。该选项确保游标上的更新和删除操作总是能够成功执行。如果定义了FAST_FORWARD选项,则不能选择它。此外,因为数据被游标锁定,所以在考虑数据并发处理时应该避免使用该选项。
乐观的
指示将数据读入游标后,如果游标中的一行数据发生了更改,更新或删除游标数据可能会导致失败。如果使用了FAST_FORWARD选项,则不能使用该选项。
TYPE_WARNING
指示如果光标类型被修改为不同于用户定义的类型,将向客户端发送警告消息。
注意:不能将SQL_92的游标语法规则与MS SQL SERVER的游标扩展用法混合使用。
下面我们将总结一些声明游标时应该注意的问题。
如果在游标之前使用SCROLL或INSENSITIVE保留字,则在游标和FOR select_statement之间不能使用保留字。事实正好相反。
如果使用DECLARE CURSOR声明游标,并且没有选择READ_ONLY、optimal或SCROLL_LOCKS选项,则游标的默认值为:
如果SELECT语句不支持更新,则游标为READ_ONLY。
静态和FAST_FORWARD游标是只读的;默认情况下;
默认情况下,动态键集游标是最佳的。
我们只能在Transact-SQL语句中引用游标,而不能在数据库API函数中引用。
声明游标后,可以通过系统过程设置其属性。
对于那些有权对视图、表或某些列执行SELECT语句的用户,它还拥有使用游标的默认权限。
相关阅读
RelatedReading猜你喜欢
Guessyoulike