计算机等级考试三级数据库模拟题SQLServer7.0入门(七)
来源:优易学  2011-10-7 12:12:39   【优易学:中国教育考试门户网】   资料下载   IT书店

  i. 声明游标在这一步中,需要指定游标的属性和根据要求产生的结果集。有两种方法可以指定一个游标。
  形式 1    ( ANSI 92 )DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR FOR select_statement [FOR{READ ONLY | UPDATE ][OF column_list]}]
  形式 2  DECLARE cursor_name CURSOR [LOCAL |GLOBAL] [FORWARD_ONLY | SCROLL] [STATIC | KEYSET | DYNAMIC] [READ_ONLY |SCROLL_LOCKS | OPTIMISTIC] FOR select_statement [FOR {READ ONLY | UPDATE ][OFcolumn_list]}]
  INSENSITIVE关键字指明要为检索到的结果集建立一个临时拷贝,以后的数据从这个临时拷贝中获取。如果在后来游标处理的过程中,原有基表中数据发生了改变,那么它们对于该游标而言是不可见的。这种不敏感的游标不允许数据更改。
  SCROLL 关键字指明游标可以在任意方向上滚动。所有的 fetch 选项( first 、 last 、 next 、 relative 、 absolute)都可以在游标中使用。如果忽略该选项,则游标只能向前滚动( next )。
  Select_statement 指明 SQL 语句建立的结果集。
  TransactSQL 语句 COMPUTE 、 COMPUTE BY 、 FOR BROWSE 和 INTO 在游标声明的选择语句中不允许使用。 READ ONLY指明在游标结果集中不允许进行数据修改。
  UPDATE 关键字指明游标的结果集可以修改。 OF column_list指明结果集中可以进行修改的列。缺省情况下(使用 UPDATE 关键字),所有的列都可进行修改。
  LOCAL关键字指明游标是局部的,它只能在它所声明的过程中使用。 GLOBAL关键字使得游标对于整个连接全局可见。全局的游标在连接激活的任何时候都是可用的。只有当连接结束时,游标才不再可用。
  FORWARD_ONLY指明游标只能向前滚动。
  STATIC 的游标与 INSENSITIVE 的游标是相同的。 KEYSET 指明选取的行的顺序。
  SQL Server将从结果集中创建一个临时关键字集。如果对数据库的非关键字列进行了修改,则它们对游标是可见的。因为是固定的关键字集合,所以对关键字列进行修改或新插入列是不可见的。DYNAMIC 指明游标将反映所有对结果集的修改。
  SCROLL_LOCK 是为了保证游标操作的成功,Examda提示:而对修改或删除加锁。
  OPTIMISTIC指明哪些通过游标进行的修改或者删除将不会成功。
  注意: · 如果在 SELECT 语句中使用了 DISTINCT 、 UNION 、 GROUP BY语句,且在选择中包含了聚合表锸剑蛴伪曜远?INSENSITIVE 的游标。
  · 如果基表没有唯一的索引,则游标创建成 INSENSITIVE 的游标。
  · 如果 SELECT 语句包含了 ORDER BY ,而被 ORDER BY 的列并非唯一的行标识,则 DYNAMIC 游标将转换成 KEYSET游标。如果 KEYSET 游标不能打开,则将转换成 INSENSITIVE 游标。使用 SQL ANSI-92 语法定义的游标同样如此,只是没有INSENSITIVE 关键字而已。
  ii. 打开游标打开游标就是创建结果集。Examda提示:游标通过DECLARE 语句定义,但其实际的执行是通过 OPEN 语句。
  语法如下: OPEN { { [GLOBAL] cursor_name } |cursor_variable_name} GLOBAL 指明一个全局游标。
  Cursor_name 是被打开的游标的名称。
  Cursor_variable_name 是所引用游标的变量名。该变量应该为游标类型。在游标被打开之后,系统变量 @@cursor_rows可以用来检测结果集的行数。
  @@cursor_rows 为负数时,表示游标正在被异步迁移,其绝对值(如果 @@cursor_rows为-5,则绝对值为5)为当前结果集的行数。异步游标使用户在游标被完全迁移时仍然能够访问游标的结果。
  iii. 从游标中取值在从游标中取值的过程中,可以在结果集中的每一行上来回移动和处理。如果游标定义成了可滚动的(在声明时使用SCROLL 关键字),则任何时候都可取出结果集中的任意行。对于非滚动的游标,只能对当前行的下一行实施取操作。结果集可以取到局部变量中。
  Fetch命令的语法如下: FETCH [NEXT | PRIOR| FIRST | LAST | ABSOLUTE {n | @nvar} | RELATIVE {n| @nvar}] FROM [GLOBAL] cursor_name} | cursor_variable_name} [INTO@variable_name ][,……n]] NEXT 指明从当前行的下一行取值。
  PRIOR 指明从当前行的前一行取值。
  FIRST 是结果集的第一行。
  LAST 是结果集的最后一行。
  ABSOLUTE n 表示结果集中的第 n 行,该行数同样可以通过一个局部变量传播。行号从 0 开始,所以 n 为 0时不能得到任何行。
  RELATIVE n 表示要取出的行在当前行的前 n 行或后 n 行的位置上。如果该值为正数,则要取出的行在当前行前 n行的位置上,如果该值为负数,则返回当前行的后 n 行。
  INTO @cursor_variable_name表示游标列值存储的地方的变量列表。该列表中的变量数应该与 DECLARE语句中选择语句所使用的变量数相同。变量的数据类型也应该与被选择列的数据类型相同。直到下一次使用 FETCH 语句之前,变量中的值都会一直保持。每一次 FETCH的执行都存储在系统变量 @@fetch_status 中。
  如果 FETCH 成功,则 @@fetch_status 被设置成 0 。@@fetch_status 为 -1 表示已经到达了结果集的一部分(例如,在游标被打开之后,基表中的行被删除)。
  @@fetch_status可以用来构造游标处理的循环。
  例如: DECLARE @iname char(20), @fname char(20) OPEN author_cur FETCHFIRST FROM author_cur INTO @iname, @fname WHILE @@fetch_status = 0 BEGIN IF@fname = ‘ Albert ’ PRINT “ Found Albert Ringer ” ELSE Print “ Other Ringer ”FETCH NEXT FROM author_cur INTO @iname, @fname END

[1] [2] 下一页

责任编辑:小草

文章搜索:
 相关文章
热点资讯
热门课程培训