15ESQLC程序中使用滚动游标.docx
- 文档编号:2171751
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:20
- 大小:1.20MB
15ESQLC程序中使用滚动游标.docx
《15ESQLC程序中使用滚动游标.docx》由会员分享,可在线阅读,更多相关《15ESQLC程序中使用滚动游标.docx(20页珍藏版)》请在冰豆网上搜索。
15ESQLC程序中使用滚动游标
第十五章
ESQL/C程序中使用滚动游标
本章讨论在ESQL/C程序中以任意的顺序检索活动集中的记录。
将学习使用哪些SQL语句来设置游标和浏览活动集。
同查询游标相关联的语句有五个:
●DECLARE
●OPEN
●FETCH
●CLOSE
●FREE
这些语句在后续部分讨论。
DECLARE语句定义一个游标。
它给游标命名并把一个查询同游标相关联。
为定义一个滚动游标,使用语法:
DECLARECursorIdSpecSCROLLCURSOR[WITHHOLD]FORSelectStmt
CursorIdSpec
标识游标的名称。
它必须是一个实实在在的标识符或存放有标识符的宿主变量。
标识名称以字母开头,可以多达18个字母、数字或下划线。
标识名称不能是保留字。
标识名称在整个程序中必须唯一,除非使用-local标志来编译源文件,在这种情况里,它们在该源文件中必须唯一。
SelectStmt
为查询指明SELECT语句。
可以在SELECT语句中使用INTO子句或在FETCH语句中使用它;必须在两者中的某一处使用它。
不要在SELECT语句中使用INTOTEMP子句;它同INTO子句不兼容,会导致SQLERROR。
使用WITHHOLD选项时,当事务结束时,游标保持打开状态。
当操作master-detail关系时,在一个事务中完成对detail的修改,但是,在事务完成,操作master时,希望游标保持打开状态。
此时,该选项很有用。
DECLARE语句定义游标。
在DECLARE语句中说明的SELECT语句在定义游标时不会执行。
DECLARE语句只是一个声明,不是对执行的请求。
所以,同数据库服务器之间不存在有任何的通讯。
当执行时,DECLARE语句:
●在数据段中为游标结构分配空间,并设置好游标。
给游标命名,并把所说明的SELECT语句同它永久地相关联。
●把该结构中的几个指针初始化为空值。
另外,还完成一些其它的事情,但是同本内容不是特别有关系。
游标结构一直保留在内存中,即使是在使用了CLOSE语句来使它处于不活动状态。
为重新激活游标,仅需要再次打开它。
释放同该结构相关联的内存只能使用FREE语句,将在本章的后面部分讨论。
可以定义任何数目的游标,仅受可用内存的限制。
OPEN语句激活游标,并开始执行相关联的SELECT语句。
为激活游标,使用语法:
OPENCursorIdSpec
CursorIdSpec
指明由先前的DECLARE语句创建的游标。
可以是实实在在的标识符或存放标识符的字符宿主变量。
如果在WHERE子句里有宿主变量,则仅当打开游标时才用它们的值。
当游标打开之后,以后对于这些变量所作的修改不会影响活动集。
OPEN语句激活游标,当执行时,OPEN语句:
1.把SELECT语句送给服务器,并请求它:
检查语法、语义和SELECT语句的上下文:
☐存在一个名称为customer的表吗?
☐字段列表中所选择的字段都在该表中吗?
☐用户是否有权限来查询记录?
优化查询路径
2.在数据段中分配缓冲区,并初始化游标结构,使该结构指向缓冲区。
3.开始执行SELECT语句,直到标识了活动集:
定位或构建该集合的头一个记录,包括打开所有需要的文件和创建临时表。
活动集一直存在,直到关闭游标,此时释放活动集,或直到重新打开游标。
重新打开游标使得先关闭游标,然后再打开。
此时再次使用宿主变量,并生成新的活动集。
当重新打开游标时,数据库服务器通常不会重新分析SELECT语句的语法,也不会重新优化它。
但是,如果已经使用FREE语句释放了同游标相关联的内存,服务器将会重新做这些事情。
FETCH语句把已打开的游标移动到一个新的位置,并把记录的字段值存放到INTO子句中说明的宿主变量中。
如果省略INTO子句,则必须在相关联的SELECT语句中把它包括进去。
为从一个滚动游标获取一条记录,使用语法:
FETCH[Position]CursorIdSpec[INTOHostVarList]
对于一个滚动游标,该新位置可以是活动集中的任意位置。
它可以是:
绝对位置,用下面的选项来指明:
FIRST取得活动集中的第一个记录。
LAST取得活动集中的最后一个记录。
CURRENT取得当前记录,当前指向的记录。
ABSOLUTEn取得活动集的第n个记录(n相对于1)。
相对位置,可以由下面的选项来指明:
NEXT
取得活动集的下一个记录。
PREVIOUS
取得活动集的前一个记录。
RELATIVEn
取得相对于活动集当前记录的第n个记录:
负值向前数;正值向后数。
当使用NEXT获取一个记录时,数据库服务器从数据库中获取一个满缓冲区的记录,把它们写到临时表中,再把它们拷贝到应用程序建立的管道中。
由FETCH把它们读到数据缓冲区。
后续的向前FETCH操作首先查找数据缓冲区:
如果已有记录,把它送到宿主变量;如果缓冲区为空,FETCH从数据库服务器获取下一个满缓冲区的记录。
数据库服务器获取另一个满缓冲区的记录并把这些记录加到临时表中。
服务器不会不必要地读基表。
所有使用位置选项而不是NEXT的FETCH操作有一点不同。
这些FETCH操作仅从数据库或临时表中获取一个记录,使数据缓冲里仅有一条记录。
即,这些FETCH操作对于每一次请求进行一次管道I/O。
INTO子句告诉游标把获取的记录存放到何处。
当把该子句放到FETCH语句中,可以把记录存放到内存的不同区域。
HostVarList对于返回的每一个字段值应当有一个对应的变量。
否则,数据库服务器返回SQLERROR。
另外,如果有可能返回SQL空值,应当提供所需要的指示变量。
FETCH语句尝试把游标移动到活动集的一个新的位置,并把记录的字段值赋给宿主变量。
当游标成功地移动到指定的位置,而且,在该位置有记录,则SQLCODE值为0。
如果没有记录,则SQLCODE的值是SQLNOTFOUND(100)。
五种不同的情况会造成SQLNOTFOUND:
●活动集为空。
●执行FETCHNEXT操作,而游标正指向活动集的最后一个记录。
●执行FETCHPRIOR操作,而游标正指向活动集的第一个记录。
●执行FETCHRELATIVEn操作,而相对于活动集的当前记录没有第n个记录。
●执行FETCHABSOLUTEn操作,而活动集中没有第n个记录。
CLOSE语句关闭游标或使游标不活动,并释放活动集。
为关闭游标,使用语法:
CLOSECursorIdSpec
CursorIdSpec
指明由先前的DECLARE语句创建的游标。
可以是实实在在的标识符或存放标识符的字符宿主变量。
关闭游标之后,除了OPEN和FREE语句之外,所有其它的语句都不能再用。
可以关闭没有打开的游标。
如果这样做,数据库服务器不会采取任何动作。
但是,对于ANSI兼容的数据库,关闭一个未打开的数据库确实返回一个SQLERROR。
CLOSE语句关闭游标或使游标不活动,这时,不再有同该游标相关联的活动集。
关闭游标会释放同它关联的许多资源:
●所有的基表和临时表关闭。
●分配给游标的缓冲区被释放。
●锁被释放(除非是在一个事务中)。
有一样资源没有释放,是在原先的OPEN语句执行时创建的进行了语法分析的SELECT语句。
服务器保持该资源,当重新打开游标时,不必重新对SELECT语句进语法分析。
为释放该资源,需要执行FREE语句。
总是可以重新打开一个关闭的游标。
如果重新打开,得到另一个活动集。
该新的活动集可能是全新的,特别是当WHERE子句中的任何宿主变量的值被修改过时。
FREE语句释放程序空间和数据库服务器中的游标资源。
为释放这些资源,使用语法:
FREECursorIdSpec
CursorIdSpec
指明由先前的DECLARE语句创建的游标。
可以是实实在在的标识符或存放标识符的字符宿主变量。
推荐在释放游标之前,先显式地关闭它。
用这种方式来释放游标,应用程序和数据库服务器将不再知道该游标。
在释放游标之后,不能再打开它:
一旦释放了游标,为再打开它,必须先用DECLARE语句来定义游标。
FREE语句释放仍在程序空间和数据库服务器中的游标资源。
一旦关闭了游标,再释放它:
●释放在数据库服务器存放的进行了语法分析的SELECT语句版本
●释放由DECLARE设置的游标结构
此时,要打开和使用游标,必须首先使用DECLARE语句来声明它。
一旦释放了游标,再重新定义它,此时会再分配和初始化游标结构。
当给用户提供“菜单”接口并给他或她查询选择时,有时候需要知道游标是否被打开。
上面的例子代码示例了这种处理需要。
对于一个未打开的游标使用FETCH操作,会造成SQLERROR。
在上面的代码段中,函数QueryStock()完成这些工作:
1.把布尔变量CursorOpen设置为FALSE值。
2.定义一个滚动游标。
3.打开该游标。
4.把布尔变量CursorOpen设置为TRUE值。
5.获取并显示头一个记录。
6.如果没有找到记录,把CursorOpen设置为FALSE值。
在上面的代码中,在执行FETCHNEXT和FETCHPRIOR之前,检查CursorOpen的值。
当它的值为FALSE时,我们知道查询没有完成或活动集为空。
这一系列的动作确保在用户开始浏览记录之前有一个可用的活动集。
假定当前记录如上所示(客户号=108),当下面的FETCH语句按顺序执行时,填写游标指向的相应的客户号:
Cust#
FETCHNEXT
FETCHPREVIOUS
FETCHLAST
FETCHFIRST
FETCHRELATIVE7
FETCHABSOLUTE7
FETCHABSOLUTE15
FETCHRELATIVE-1
FETCHRELATIVE1
设置和操作滚动游标。
1.创建一个新的源文件stock_brws.ec,包括三个新函数:
QueryStock
为stock表设置一个滚动游标,打开它并获取头一个记录,它也调用DisplayStock()。
FetchStock
使用上面的游标来获取后一个或前一个记录,然后调用DisplayStock()。
DisplayStock
在终端的屏幕上显示一个记录。
2.修改在stock_main.ec文件中的驱动菜单,调用适当的新函数。
3.修改makefile以包括新模块。
4.重新生成程序。
5.运行程序并做下面的事情:
a)在查询之前,选择Next
b)选择Query,并查看头一个记录。
c)选择Next查看下一个记录。
d)对于一个记录选择Prior两次。
实习8-示例C程序
练习答案
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 15 ESQLC 程序 使用 滚动 游标
![提示](https://static.bdocx.com/images/bang_tan.gif)