电脑工作室 出版日期:99-8-30  总期号:853  本年期号:63
  Oracle Developer/2000编程小技巧
  
  刘芹

Oracle作为大型数据库管理系统,它强大而完善的数据管理功能吸引着越来越多的人们的注意。本人在Oracle系统开发中,就Developer/2000编程有如下体会,希望能给初学者提供一些参考。

使用设置选单项属性及form数据项属性限制不同用户的访问范围

一个应用系统往往有多个用户,其使用权限各不相同。比如:一个劳资系统中,用户1负责管理职工档案部分,用户2负责管理职工工资部分,用户2对职工档案没有查询权,对职工编码有查询权而没有修改权。实现上述功能的一个简单的实现办法是:

设置两个全局变量分别记录用户名和密码,在进入系统时,两个用户分别输入不同的用户名和密码,如果系统用户为用户2,在主调用模块使用SET—MENU—PROPERTY('档案录入',ENABLED,FALSE)语句设置选单项'档案录入'不能访问。在模块'工资录入'中使用SET—ITEM—PROPERTY('职工编码',ENABLED,FALSE)语句设置不能导航到数据项'职工编码'。

提高表连接的查询速度

在表连接查询时,常常用下列查询方法查询数据:

SELECT RECORDNO,NAME,AGE

FROM表1

WHERE表1.RECORDNO NOT IN

(SELECT RECORDNO

FROM表2

WHERE BIRTHDAY=′710618′);

笔者发现,如果表1的长度为6000条记录,表2的长度为1000条记录,则要4分钟才能出结果。原因是使用了比较运算符NOT IN,它的逻辑测试速度是最慢的。利用外连接替换NOT IN运算符,查询时间则缩短为50秒。修改方法如下:

SELECT RECORDNO,NAME,AGE

FROM表1,表2

WHERE表1.RECORDNO=表2.RECORDNO(+)

AND表2.RECORDNO IS NULL

AND表2.BIRTHDAY(+)=

′710618′;

利用库模块实现模块资源共享

在编程中很多FROM模块需要共用一个程序单元。ORACLE FORM 4.5提出了库模块的概念。使用库模块建立共享程序单元库,既减少了磁盘占用空间,又增加程序的可维护性。使用库模块共享程序单元的过程是:点击系统选单file—new—liberary选项,建立一库模块,在program units节点下增加一程序单元,写入需共享程序的单元编码,编译后存盘。当FORM模块需共享时,在模块的Attached Libraries节点下连接库模块(此时屏幕会提示是否要删除路径,用户选择NO)。这样,用户便可在FORM模块中直接使用共享程序单元了。

易导致查询数据错误的原因

在执行数据查询时,经常发现查询结果与预想的不同,主要原因是:

1.使用SELECT*FROM〈表名〉WHERE〈字段名〉LIKE′%′语句查询不出〈字段名〉为NULL的字段。此时需对字段为NULL的情况另外处理。如:SELECT*FROM〈表名〉WHERE〈字段名〉LIKE'%'OR〈字段名〉ISNULL

2.使用union字段连接各表时,连接顺序不是按书写的先后顺序,而是按连接表的第一个字段排序。因此,为了使表按预想的顺序连接,需在各表中插入第一字段指定排序序号。

使用视图组织报表数据简单且易于维护

ORACLE REPORT2.5提供了多种报表格式,但在报表中定义各种统计信息不仅繁琐而且不利于今后的维护,使用视图预先将各种统计、汇总数据准备好,可以起到事半功倍的作用,一旦数据源有所调整,只需修改后台视图,而不用再改前端程序了。具体做法如下:要对“表1”中的人员分单位汇总男女各有多少人数。

  表1  结构为:

UNIT

NAME

RECORENO

SEX

办公室

王五

1

财务科

李四

2

...

...

...

...

1.首先建立视图对数据进行汇总:

CREATE VIEW RYTJ(UNIT,BOY,GIRL)

AS SELECT UNIT,SUM(DECODE(SEX,′男′,1,0)),SUM(DECODE(SEX,′女′,1,0))

FROM表1;

2.使用ORACLE REPORT 2.5对视图′RYTJ′建立报表。

给报表加序号的简单办法

Oracle REPORT 2.5没有提供自动加序号功能,使用下述简单方法可实现给报表自动加序号:在数据模板中,向查询组中加入一个公式列CF—XH NUMBER(4),赋初值为0,点击[EDIT]按钮,插入编码RETURN(:CF—XH+1)。