SQL Server 7.0 入门(七)(1) 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 ][OF column_list]}] INSENSITIVE关键字指明要为检索到的结果集建立一个临时拷贝,以后的数据从这个临时拷贝中获取。如果在后来游标处理的过程中,原有基表中数据发生了改变,那么它们对于该游标而言是不可见的。这种不敏感的游标不允许数据更改。 SCROLL关键字指明游标可以在任意方向上滚动。所有的fetch选项(first、last、next、relative、absolute)都可以在游标中使用。如果忽略该选项,则游标只能向前滚动(next)。 Select_statement指明SQL语句建立的结果集。Transact SQL语句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是为了保证游标操作的成功,而对修改或删除加锁。 OPTIMISTIC指明哪些通过游标进行的修改或者删除将不会成功。 注意: · 如果在SELECT语句中使用了DISTINCT、UNION、GROUP BY语句,且在选择中包含了聚合表达式,则游标自动为INSENSITIVE的游标。 · 如果基表没有唯一的索引,则游标创建成INSENSITIVE的游标。 · 如果SELECT语句包含了ORDER BY,而被ORDER BY的列并非唯一的行标识,则DYNAMIC游标将转换成KEYSET游标。如果KEYSET游标不能打开,则将转换成INSENSITIVE游标。使用SQL ANSI-92语法定义的游标同样如此,只是没有INSENSITIVE关键字而已。 ii. 打开游标 打开游标就是创建结果集。游标通过DECLARE语句定义,但其实际的执行是通过OPEN语句。语法如下: OPEN { { [GLOBAL] cursor_name } cursor_variable_name} GLOBAL指明一个全局游标。