vince=:ls_province; ∥定义ls_province的值 OPEN CustomerCursor; 游标的类型 同其它变量一样,我们也可以定义游标的访问类型:全局、共享、实例或局部,游标变量的命名规范建议也同其它变量一样。 --声明游标 declare my_cursor cursor keyset for select * from info --删除游标资源 deallocate my_cursor
--打开游标,在游标关闭或删除前都有效 open my_cursor --关闭游标 close my_cursor
--声明局部变量 declare @id int,@name varchar(20),@address varchar(20) --定位到指定位置的记录 fetch absolute 56488 from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address --定位到当前记录相对位置记录 fetch relative -88 from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address --定位到当前记录前一条 fetch prior from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address --定位到当前记录后一条 fetch next from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address --定位到首记录 fetch first from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address --定位到尾记录 fetch last from my_cursor into @id,@name,@address select @id as id,@name as name,@address as address
实例: use database1 declare my_cursor cursor scroll dynamic /**//*scroll表示可随意移动游标指 针(否则只能向前),dynamic表示可以读写游标(否则游标只读)*/ for select productname from product
open my_cursor declare @pname sysname fetch next from my_cursor into @pname while(@@fetch_status=0) begin print ''Product Name: '' + @pname fetch next from my_cursor into @pname end fetch first from my_cursor into @pname print @pname /**//*update product set productname=''zzg'' where current of my_cursor */ /**//*delete from product where current of my_cursor */ close my_cursor deallocate my_cursor
1.4 游标的高级技巧
尽管目前基于SQL语句的后台数据库所支持的语言都大致相当,但对游标的支持却有着一些差异,例如对滚动游标支持。所谓滚动游标,就是程序员可以指定游标向前后任意一个方向滚动。如在Informix中,您甚至还可以将游标滚向结果集开头或末尾,使用的语句分别是FETCH FIRST,FETCH LAST、FETCH PRIOR和FETCH NEXT。当程序员用FETCH语句,其缺省是指FETCH NEXT。由于滚动是在数据库后台实现的,所以滚动游标为用户编程提供了极大的方便。 对游标支持的另一个不同是可修改游标。上述游标的使用都是指只读游标,而象Oracle、Sybase等数据库却另外支持可作修改的游标。使用这样的数据库,您可以修改或删除当前游标所在的行。例如修改当前游标所在行的用户的余额,我们可以如下操作: UPDATE customer SET balance=1000 WHERE CURRENT of customerCursor; 删除当前行的操作如下: DELETE FROM Customer WHERE CURRENT OF CustomerCursor; 但是如果您当前使用的数据库是Sybase,您需要修改数据库的参数,将游标可修改的值定为1,才能执行上述操作。这一赋值在连接数据库的前后进行均可。 SQLCA.DBParm="Cursor Update=1" 另外一个内容是动态游标,也就是说您可以运行过程中动态地形成游标的SELECT语句。这同在PowerBuilder中动态地使用嵌入式SQL一样,需要用到DynamicStagin-gArea等数据类型,这已超出了本节的范围。 |