游标的定义和使用.doc_第1页
游标的定义和使用.doc_第2页
游标的定义和使用.doc_第3页
游标的定义和使用.doc_第4页
游标的定义和使用.doc_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第三章 游标的定义和使用 第三章 游标的定义和使用3.1 游标的分类前面介绍的SELECT语句只能处理返回一行数据的情况,当SELECT语句返回多个数据行时,必须使用游标。 游标是指向SELECT语句查询出的多行数据的指针,SELECT语句查询出的行组成一结果表,称为活动集。游标指向的行称为当前行。一般说来,游标分为三类: (1)滚动游标 (2)非滚动游标 (3)更新游标 滚动游标是指程序可以根据需要指向活动集的某一行数据,即游标的位置可来回移动。非滚动游标是指活动集中的每行只能依次被读出。更新游标是非滚动游标,它的特点在于:数据库对游标指向的当前行加锁,当程序读下一行数据时,本行数据解锁,下一行数据加锁。锁加在数据库基本表对应的行上。 另外一种分类方法是将ESQL/C提供的游标分为两种类型,select游标和insert游标,select游标用于处理查询结果为多行数据的select语句;insert游标用于成块地往数据库中插入数据。3.2 定义与使用游标的语句 定义和使用游标的语句以及与游标相关的语句有五个: (1)DECLARE语句 这条语句用来定义游标,其一般形式是: DECLARE 游标名 SCROLL CURSOR FOR SELECT语句 有关键字SCROLL的DECLARE语句定义的是滚动游标。SELECT语句可表为: SELECT子句 INTO子句 FROM子句 WHERE子句 GROUP BY子句 HAVING子句 ORDER BY子句 INTO TEMP子句 DECLARE语句的作用是在数据库系统表中分配该游标资源,给游标一个自己的名字。游标名的作用范围是只要游标不被释放(FREE),在定义它的模块内有效。 (2)OPEN语句 在取得游标中的数据之前必须先执行OPEN语句来打开游标。OPEN语句的形式是: OPEN游标名 OPEN语句的作用是,把SELECT语句送到SQL语句检查器中分析,决定活动集的内容,为SELECT语句的结果分配一块内存空间。对于打开滚动游标来说,还要建一个临时表。同时,OPEN语句把游标定位到活动集的第一行。 (3)FETCH语句 FETCH语句的一般形式: FETCH 位置 游标名 INTO variable-list 位置可以是这些关键字之一:NEXT,PREVIOUS,PRIOR,FIRST,LAST,CURRENT,RELATIVE n,ABSOLUTE n;FETCH中的INTO子句与SELECT语句中的INTO子句,二者必居其一。INTO关键字后跟宿主变量。 FETCH语句的作用是使游标定位到活动集的某行上。不管是否带有选择项,FETCH在完成游标的定位后,如果游标定位在活动集上,则把游标所在行的各列值分别赋给INTO子句中的各变量,如果游标定位在活动集以外,则把全局变量status的值置为NOTFOUND。游标定位在活动集第一行时执行FETCH PREVIOUS语句,或者,当游标定位在活动集最后一行时执行FETCH NEXT语句都会把游标定位到活动集以外。因此,使用FETCH语句时,经常要检查status的值是否等于NOTFOUND,以便进一步的操作。 (4)CLOSE语句 关闭游标,CLOSE语句的一般形式是: CLOSE游标名 执行这条语句会释放OPEN语句分配的存储资源。需要再用该游标时,执行OPEN语句。 (5)FREE语句 FREE语句将把登记在系统表中的游标名删除,此后便不能再OPEN该游标了。3.3 select游标 C语言中嵌入的单个select语句,只能处理查询结果恰好是一行数据的情况,当查询出多行数据时,ESQL/C就会报错。为此,ESQL/C提供了游标这一手段来处理这种情况。 查询语句select返回的多行数据称为活动集。ESQL/C程序中,一次只能处理活动集中的一行,这一行就叫做当前行。游标是指向当前行的一个指针。可见,游标是由活动集和一个指针来组成的。游标有两种状态,打开和关闭。当游标处于打开状态时,它指向活动集的位置有四种情况:(1)指向当前行;(2)指向两行之间;(3)指向第一行的前面;(4)指向最后一行的后面;当游标处于关闭状态时,它不再和活动集相关联。 使用select游标的步骤如下: (1)将游标与select语句相关系:使用declare语句将一个命名的游标与要处理的select语句联系在一起。游标有两种,普通游标和滚动游标。在普通游标中,用户只能按既定的顺序来取数据。滚动游标允许用户按随机顺序来取活动集中的任一数据行。 下面的例子中定义了滚动游标q_curs,将表customer中的数据全部取出来: $ declare q_curs scroll cursor for select * from customer; 下例定义了一普通游标,将表customer中lname的值与变量last_name的值匹配的行全部取出来: $ declare cust_curs cursof for select * from customer where lname matches $ last_name; 游标的作用域是从说明该游标的行到该源代码文件尾,因此对游标的说明必须在游标的引用之前。 (2)打开游标:open语句使与select语句相关联的游标处于打开状态,所做的工作如下:用宿主变量含有的当前值来设定查询语句的查询条件,并做一些初始化处理。例如,当语句带有排序子句order by时,创建一临时表存放数据。当游标处于打开状态后,对宿主变量所做的任何改动不再影响查询语句返回的活动集的值。 (3)选取并处理数据:fetch语句将游标移到特定的行,并将该行数据取出,放到相应的宿主变量中。 (4)关闭游标:close语句使游标处于关闭状态并释放活动集及其它所占资源。下面是使用游标的程序片断 $ declare x_curs cursor for select order_num, order_date from orders where paid_date is null and ship_date$p_date for update of paid_date; /*说明游标x_curs */ $ open x_curs; /*打开游标x_curs */ $ fetch x_curs into $ order_num, $ order_date; /*从活动集中取出当前行,放入宿主变量中*/ $ update orders set paid_date = TODAY where current of x_curs; /*?滚动游标可以这样用吗?*/ /*修改当前行*/ $ close x_curs; /*关闭游标x_curs*/ 再看一个使用滚动游标的例子 $ declare q_curs scroll cursor for select order_date from orders where customer_num=118; /*说明一滚动的游标,找出118号 客户的所有订单的计货日期*/ $ open q_curs; /*打开游标*/ $ fetch first q_curs into $ order_date; /*取活动集中的第一行数据*/ $ fetch last q_curs into $ order_date; /*取活动集中的最后一行数据*/ $ close q_curs; /*关闭游标*/ 对于滚动游标,fetch语句进行随机选取的方式有以下六种 FIRST:取活动集中的第一个 LAST:取活动集中的最后一个 NEXT:取当前行的下一个,即后面一个 PRIOR or PREVIOUS:取当前行的前面一个 ABSOLUTE n:取活动集中的第n个 RELATIUE m:以当前行为中心的第m个3.4 INSERT游标 INSERT游标用以提高往数据库中插入数据的效率。数据库的数据文件是存放在外存的,用INSERT语句插入数据是将数据直接插入数据库文件中,引发I/O操作。为了提高效率,将INSERT语句同游标联系起来,在内存中为插入的数据分配缓冲区,当缓冲区填满时,再一起插入外存的数据库文件中,从而大大减少了I/O次数,提高了效率。下面说明使用INSERT游标的步骤: (1)用DECLARE语句说明INSERT游标,将一命名的游标与INSERT语句联系起来,这里的 INSERT语句不能包含子查询,也不能将INSERT游标说明成滚动的。 (2)用OPEN语句打开游标,为INSERT游标分配插入缓冲区。 (3)用PUT语句将数据放入缓冲区中,当缓冲区填满时,ESQL/C自动将数据成块地写入 数据库文件中。 (4)用FLUSH语句,迫使ESQL/C将缓冲区中的数据写入数据库文件中,游标并不关闭。 (5)用CLOSE语句缓冲区中的数据写入数据库文件中,然后关闭游标。例:$ declare ins_curs cursor for insert into customer values($ cust_rec);

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论