李茂斌++姚红++朱海鹏
摘要:该文论述了在复杂数据库编程中,使用游标检索的方法对多条记录的操作,很好地解决了数据库编程中无法直接对多条记录操作的问题。
关键词:游标;检索;数据库编程
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2016)26-0001-02
Retrieving Resolution Analysis of Complicated Database Based on Cursor Technology
LI Mao-bin,YAO Hong,ZHU Hai-peng
(CSFCC,Chengdu 611731,China)
Abstract: This paper introduce the retrieving technology using cursor for several records in process of complicated database programming. In a certain extent, it could greatly resolute the problems of several records which could not be operated during database programming.
Key words: cursor;retrieval;database programme
1 引言
在数据库开发过程中,当检索的数据只是一条记录时,我们经常使用查询语句。但是在实际开发中经常会遇到这样的情况,即从一个结果集中逐一地取出每条数据,操作这条数据,如何解决这种问题呢?游标技术正好提供了一个很好的解决方法。
2 游标概述
游标施展才华的地方是构建在SQL中,用来查询数据库,获取记录集合的指针,它可以让开发者一次访问一行结果集,这可以让程序员完成需要分别在结果集中每个记录上执行的过程代码的任务,游标可以让我们以编程方式访问我们的数据。
在数据库中,游标提供一种像C语言一样对数据库表检索的灵活手段,使得程序员可以把结果集中的数据逐条取出来,来满足程序的要求,避免SQL编码中的短板。
3 复杂信息数据库编程问题的提出
在某项目数据库设计中,整件明细表导出的时候,整件涉及嵌套的问题,无法一次查询完成,整件关系如图1所示。这个时候就需要游标来解决。
创建一个过程,过程中游标检索子节点中是否还包含整件,如果包含就嵌套调用这个过程,如果没有就直接检索所有的值,按顺序列出到明细表中,检索流程如图2所示。
4 游标操作
游标使用的步骤如下:声明游标、打开游标、提取数据、关闭游标。
4.1 声明游标
游标使用前,首先声明它。游标的声明包括两个部分:游标的名称和这个游标用到的SQL语句。如声明一个PrjCursor的游标以查询某个整件下面的明细表信息,可以编写如下代码:
DECLARE PrjCursor CURSOR FOR
SELECT * FROM view_Prj WHERE FathPrjNo ="168";
游标的声明有一点注意的是,声明游标的代码行是不执行的,不能将debug时的断点设在这一行代码行上,也不能声明两个同名的游标。
4.2 打开游标
声明了游标后,操作前先打开游标。打开后执行这段SQL代码,例如打开上面声明的一个游标,我们需要输入代码:
OPEN PrjCursor;
打开游标是对数据库进行查询操作,这将耗费一段时间,具体耗费时间的量取决于使用系统的性能和SQL语句的复杂程度。
4.3 提取数据
当打开了游标并在数据库中执行了查询后,要用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入程序员指定的变量中,通过FETCH语句我们逐条得到查询结果。在FETCH语句中可以指定游标的名称和目标变量的名称。代码如下:
FETCH PrjCursor INTO emp_PrjCursor;
上述方法就是取得一条数据的方法,通常情况下,我们要获取一个结果集的数据,所以我们通常都是把游标放置在一个循环体内,直至将结果集中的全部数据提取后,跳出循环。我们编写如下代码:
loop
fetch PrjCursor INTO emp_PrjCursor;
if(emp_PrjCursor%found) then
/*执行操作语句*/
end if;
end loop;
d) 关闭游标
在游标操作完成后关闭游标,以使系统释放游标占用的资源。代码如下所示:
CLOSE PrjCursor;
5 实例
通常我们把这段游标的代码封装在一个过程里,然后用这个过程来嵌套调用,这样不管实际嵌套多少层,都可以很好的满足要求。过程代码如下:
CREATE PROCEDURE procedure_MX(
iFathPrjNo in number /*过程参数:父节点序号*/
)
BEGIN
DECLARE CURSOR PrjCursor IS
SELECT * FROM view_Prj WHERE FathPrjNo = iFathPrjNo ;
emp_PrjCursor view_Prj %rowtype;
BEGIN
OPEN PrjCursor;
LOOP
FETCH PrjCursor INTO emp_PrjCursor;
IF(emp_PrjCursor%FOUND) THEN
procedure_MX(emp_PrjCursor. FathPrjNo);
/*执行操作语句*/
END IF;
END LOOP;
CLOSE PrjCursor ;
END;
END procedure_MX;
6 结论
在复杂数据库编程中,这种多条记录查询、操作的情况比较常见,但是数据库语言又不能像高级语言一样很灵活的进行循环嵌套等操作,游标技术很好地解决了这个问题,使得数据库编程也可以实现高级语言的大部分操作,同时也可以为项目的其他部分提供借鉴。
参考文献:
[1] Sean Dillon,Christopher Beck,等.袁勤勇,何欣,等译.Oracle编程入门经典[M].北京:清华大学出版社,2002.11.
[2] Thomas Kyte.Orcale9i&10g编程艺术深入数据库体系结构[M]. 苏金国,王小振,等译.北京:人民邮电出版社,2006.10.
[3] Hector Garcia-Molina,Jeffrey.D.Ullman. Database Systems:the Complete Book(second edition)[M].Prentice Hall,2008.
[4] Rahimi,Saeed K.Haug,Grank S. Distributed Database Management Systems:A Practical Approach[M]. Wiley-IEEE Computer Society Press,2010.