1、游标的使用,PL/SQL语言通过游标提供了对一个结果集进行逐行处理的能力。游标可视作一种特殊的指针。游标的表现形式类似于一些编程语言中的文件名,程序像打开文件访问文件内容一样打开游标获得对查询结果的访问权。游标的使用:1、声明游标(DECLARE cursor_name CURSOR FOR +SELECT语句/DECLARE CURSOR cursor_name IS SELECT 语句)2、打开游标(OPEN cursor_name )3、读取数据(FETCH cursor_name INTO variable_name)4、关闭游标(CLOSE cursor_name ),游标使用实例,
2、Create Proc Pr_DeleteTable as Declare Table varchar(20)Declare cr_cursor cursor for select name from dbo.sysobjects where xtype=U and state 0Open cr_cursorFetch cr_cursor into Table while fetch_state =0 begin print Table Fetch next cr_cursor into Table end;Close cr_cursor,Fetch 语句,Fetch cursor_name
3、into + 变量名Fetch语句检索查询结果的一条记录给应用程序使用,在fetch语句中命名的游标确定使用查询结果中的哪一条记录。Fetch语句取出数据项目记录放到一个变量列表中,列表中变量的数量必须与查询结果中字段的数量相同,Fetch语句将按照以下规则在查询结果中逐记录移动游标:,1、open语句将游标放置到查询结果的第一条记录前面,这种状态下,游标没有当前记录。2、如果有下一条有效的查询结果记录的话,fetch语句将游标向前移动到该位置。这个记录将成为游标的当前记录。3、如果一条fetch语句将游标向前移动到超过查询结果最后一条记录的位置,该语句会返回not found警告,这种状态下
4、,游标没有当前记录。4、close语句结束对查询结果的访问,将游标设置于一种关闭的状态。,游标的使用,查询出来的数据集做循环使用。(比如把表中某一字段的值select出来,循环相加或链接),查询test列,查询的值累加可用存储过程加游标实现,cursor实现:,p1 intDeclare tt varchar(100);Declare bb varchar(10);Set tt=Set bb=Declare mycur cursor for select meno from test where gid=p1Open mycur Fetch mycur into bb while FETCH_
5、STATUS =0 BEGINSet tt=tt+bbFetch next mycur into bbEnd ;Close mycurSelect tt,基于cursor的删除和更新,应用程序经常采用游标以允许用户逐记录浏览表中的数据。游标的作用是一个指示当前查询结果记录的指针。更新或删除某个记录,记录并不是被平常的SQL搜索识别出的,而是程序使用游标作为指针来指出哪一条记录将要被更新或删除。,基于游标的更新,UPDATE table_name SET 字段名=表达式 WHERE CURRENT OF cursor_nameUPDATE可更新表中的某个单独的记录,被更新的记录是引用表的游标的当
6、前记录,为了处理该语句,SQL会找到与游标当前记录对应的表的记录,并更新在SET子句中的记录。在记录更新后,它继续作为游标的当前记录。UPDATE或DELETE语句中的WHERE CURRENT OF子串专门处理要执行UPDATE或DELETE操作的表中取出的最近的数据。,基于游标的删除,DELETE FROM cursor_name WHERE CURRENT OF cursor_nameDELETE 可删除表中的某条单独的记录,被删除的记录是引用表的游标的当前记录,为了处理该语句,SQL会找到与游标当前记录对应的表的记录,并从表中删除该记录。记录被删除后,游标就没有当前记录了,此时,游标被
7、定位再删除记录留下的空白空间中,等待后续的FETCH语句调动它前进到下一记录。,基于游标的更新和删除,Fetch cr_cursor into v_nameIf v_name =电子图书 thenUpdate communitytype cSet c.english_name=ebook where current of cr_cursor;End if;使用游标删除数据,同上,只要将更新语句换成删除语句即可。,注意:,1、在提取了游标数据后,为了更新或删除当前游标行数据,必须在update或delete语句中引用where current of子句。2、与游标结合再一起的查询必须从一个单独的源表中提取数据。3、查询不能制定order by 子句,游标禁止识别分类的查询结果。4、查询不能制定distinct关键字。5、查询不能包括group by或having子句。,