1、工程数据管理,西安工程大学机电工程学院,西安工程大学 机电工程学院 工程数据管理,工程数据管理,西安工程大学机电工程学院,第9章 游标,Select语句是查询语句,查询的结果可以返回若干行,另如果有where子句时,select语句返回的行集包括所有满足where子句条件的记录,这一行集被称为结果集。Selcect语句得到的行集,只能浏览该结果集的数据,但不能对该结果集里的数据进行逐行处理。 如果希望对select结果集中的数据进行逐行处理,可以使用游标技术。顾名思义,游标就是游动的光标,它是从数据表中提取出来的数据,以临时表的形式存放在内存中,游标向数据库发送查询,得到一个记录集,但是游标一
2、次只返回一个记录行,而不是大批返回行,游标可以在记录集上滚动,可以指向记录集中的任何一个记录行。游标允许应用程序通过游标来定位修改表中的数据。并允许应用程序对select查询语句的结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作。使用游标有以下几个优点: 1)可以逐行的处理数据。 2)允许程序对由select语句产生的结果集的每一行执行相同或不同的操作。 3)允许从结果集中检索指定的行。 4)允许结果集中的当前行被修改。 5)允许由其他用户修改的数据在结果集中是可见的。,工程数据管理,西安工程大学机电工程学院,第9章 游标,在数据库中游标是一个非常重要的概念,它是一种数
3、据库结构,在使用之前需要先声明游标,也就是要用declare cursor来定义。有两种方法来定义:一种是SQL-92语法,一种是transact-SQL语法。SQL-92语法与transact-SQL语法的关系:ANSI SQL-92 定义的数据库构造的标准化架构。 Transact-SQL是SQL编程语言的一种版本,只在SQL Server中使用。 也就是说ansi sql-92是一个标准,而Transact-sql中对这个标准的一个实现. 因为我们讲的是SQL语句,所以只讲transact-SQL语法,另外,如果对ANSI SQL-92有兴趣的学生可以去学一下。现在看transact-S
4、QL语法对游标的创建:,工程数据管理,西安工程大学机电工程学院,第9章 游标,先看一个例子: Use my_db1 Go Declare stu_info_cur scroll cursor For Select xh,xm,csrq from stu_info Where xm=陈明 Gostu_info_cur:游标的名字 Scroll:为游标的类型下来看游标的使用: 再使用游标时必须先声明游标,从上面的例子可以看出,声明完后,打开游标,打开后还要读取游标。最后是关闭游标。 下来看具体的方法:,工程数据管理,西安工程大学机电工程学院,第9章 游标,1)声明游标Declare cursor_
5、name localglobalforward_onlyscrollkeysetdynamicfast_forwardread_onlyscroll_locksoptimistictype_warning cursor For select_statement各参数定义: Local:表明是局部游标,其作用的域只在个别场合下;globle:全局游标,作用的域可在任何情况下。 forward_only:从游标中提取记录时,只能按从第一行到最后一行的顺序提取,另外不能和fast_forward同时使用。 Keyset:定义的游标是一个键集驱动游标,当游标被打开时,游标中列的顺序是固定的,并且会在t
6、empdb中建一个临时表,该表即为Keyset,它的键值可唯一识别游标中的某行数据。 Dynamic:定义的游标为动态游标,使用这个会最大程度上保证数据的一致性。 fast_forward:使得read_only和forward_only执行最优。 scroll_locks:在数据被读入游标时,就锁定基本表中的数据行,以确保以后能通过游标成功地对基表进行更新和删除。,工程数据管理,西安工程大学机电工程学院,第9章 游标,Optimistic:在数据被读入游标后,如果游标中某行数据已发生变化,那么对其操作可能会失败。 type_warning:当游标类型被修改成与用户自定义类型不同时,将发送一个
7、警告。,工程数据管理,西安工程大学机电工程学院,第9章 游标,2)打开游标 声明游标后必须打开才可以使用,因为声明一个游标后,游标中并没有任何数据,是无法使用的,只有将游标打开以后才可以使用游标。具体的语法: Open global cursor_namecursor_variable_name 参数定义如下: Global:为全局游标,对应一个local,局部游标 cursor_name:游标名 cursor_variable_name:游标变量名称,该名称引用一个游标。游标打开后,可以从全局变量cursor_rows中读取游标结果集合中的行数。它有以下几种取值:n表示该游标所定义的数据已完
8、全从表中读入,n 为全部的数据行;-m表示所定义的数据未完全从表中读入,m 为目前游标数据子集内的数据行;0表示无符合条件的数据或该游标已被 关闭或释放;-1表示该游标是动态的,数据行经常变动,无法确定。,工程数据管理,西安工程大学机电工程学院,第9章 游标,打开完游标后还要读取游标,这样就可以从游标中逐行地读取数据,语法是fetch语句: Fetch nextpriorfirstlastabsolute nnvar relative nnvar From Cursor_nameCursor_variable_name 各参数定义如下: Next:表示返回下一行 Prior:表示返回上一行 F
9、irst:表示返回第一行 Last:表示返回最后一行 absolute nnvar :表示读取游标中第nnvar行数据,如果nnvar是负值,则表示在游标当前位置向前的第n行 relative nnvar:表示从游标当前位置起的第n行。,工程数据管理,西安工程大学机电工程学院,第9章 游标,下来再看一个例子: Use my_db1 Go Open stu_info_cur Go Fetch next From stu_info_cur Go3)使用游标修改数据 使用游标中的数据时,会影响到游标的基表 A、使用游标更新数据,看一个例子 Use my_db1 Go Update stu_info Set xm=张三 Where current of stu_info_cur Go,工程数据管理,西安工程大学机电工程学院,第9章 游标,B、使用游标删除数据 Delete from table_name Where current of cursor_name最后,处理完所有游标中的数据后,必须关闭游标来释放数据结果集。 语法:close cursor_name,