SQL游标原理和使用方法
来源:优易学  2011-12-20 13:52:20   【优易学:中国教育考试门户网】   资料下载   IT书店

  lb_continue=True
  ll_total=0
  DO WHILE lb_continue
  FETCH CustomerCur-sor
  INTO:ls_acct_no,
  :ls_name,
  :ll_balance;
  If sqlca.sqlcode=0 Then
  ll_total+=ll_balance
  Else
  lb_continue=False
  End If
  LOOP
  循环体的结构有多种,这里提到的是最常见的一种。也有的程序员喜爱将一条FETCH语句放在循环体的前面,循环体内再放置另外一条FETCH语句,并检测SQLCA.SQLCODE是否为100。但是这样做,维护时需同时修改两条FETCH语句,稍麻烦了些。
  关闭游标
  在游标操作的最后请不要忘记关闭游标,这是一个好的编程习惯,以使系统释放游标占用的资源。关闭游标的语句很简单:
  CLOSE CustomerCursor;
  使用Where子句子
  我们可以动态地定义游标中的Where子句的参数,例如在本例中我们是直接定义了查询省份是北京的记录,但也许在应用中我们要使用一个下拉式列表框,由用户来选择要查询的省份,我们该怎样做呢?
  我们在前面曾经提到过,DECLARE语句的作用只是定义一个游标,在OPEN语句中这个游标才会真正地被执行。了解了这些,我们就可以很方便地实现这样的功能,在DECLARE的Where子句中加入变量作参数,如下所示:
  DECLARE CustomerCursor CURSOR FOR
  SELCECT acct_no,name,balance
  FROM customer
  WHERE province=: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等数据类型,这已超出了本节的范围。

上一页  [1] [2] 

责任编辑:小草

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