Developer开发文章 Oracle

发布时间 : 星期一 文章Developer开发文章 Oracle更新完毕开始阅读

A.SHIPMENT_NO=B.SHIPMENT_NO AND A.CONTRACT_NO=B.CONTRACT_NO AND B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND

D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND C.TRANSFER_NUMBER IS NOT NULL AND C.TRANSFER_DATE IS NOT NULL;

SHIPMENT_NO_TMP ACM.SHIPMENT_NO%TYPE; ARRIVAL_DATE_TMP ACM.ARRIVAL_DATE%TYPE;

DELIVERY_REF_1_TMP ACMCONTRACT.DELIVERY_REF_1%TYPE; DELIVERY_REF_3_TMP ACMCONTRACT.DELIVERY_REF_3%TYPE; DELIVERY_REF_2_TMP ACMCONTRACT.DELIVERY_REF_2%TYPE; CASE_NO_TMP ACMCASE_PL.CASE_NO%TYPE; LRCM_CODE_TMP ACMCASE_PL.LRCM_CODE%TYPE; ANN_QUANTITY_TMP ACMCASE_PL.ANN_QUANTITY%TYPE; QUANTITY_DESCRIPTION_TMP ACMCASE_PL.QUANTITY _DESCRIPTION%TYPE;

SPARE_PART_TMP ACMCASE_PL.SPARE_PART%TYPE; TRANSFER_NUMBER_TMP ACMCASE_PL.TRANSFER _NUMBER%TYPE;

TRANSFER_DATE_TMP ACMCASE_PL.TRANSFER _DATE%TYPE;

NCOUNT NUMBER; BEGIN

/*NCOUNT为游标循环的总记数*/

SELECT COUNT(*) INTO NCOUNT

FROM ACM A,ACMCONTRACT B,ACMDELIVERY_PL D, ACMCASE_PL C WHERE

A.SHIPMENT_NO=B.SHIPMENT_NO AND A.CONTRACT_NO=B.CONTRACT_NO AND B.DELIVERY_REF_1=D.DELIVERY_REF_1 AND B.DELIVERY_REF_2=D.DELIVERY_REF_2 AND B.DELIVERY_REF_3=D.DELIVERY_REF_3 AND D.DELIVERY_REF_1=C.DELIVERY_REF_1 AND D.DELIVERY_REF_2=C.DELIVERY_REF_2 AND D.DELIVERY_REF_3=C.DELIVERY_REF_3 AND

D.CASE_NO=C.CASE_NO AND C.SPARE_PART='SO' AND C.TRANSFER_NUMBER IS NOT NULL AND C.TRANSFER_DATE IS NOT NULL;

/* 初始化DDE,同EXCEL及文件建立联系, 此时要确保EXCEL将EXCEL.XLS文件打开 */ ConvID := DDE.Initiate('EXCEL', 'C:\\excel.xls');

/* 先在EXCEL文件中第一行加入字段名称,

其中DDE.CF_TEXT为文本型数据,1000为1000毫秒 */ DDE.Poke(ConvID, 'R1C1','船运号', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C2','到达日期', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C3','包装箱号', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C4','LRCM号', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C5','SO标识', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C6','移交单', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C7','移交日期', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C8','移交数量', DDE.CF_TEXT, 1000); DDE.Poke(ConvID, 'R1C9','设备材料描述', DDE.CF_TEXT, 1000);

OPEN C1;

FOR i IN 1..NCOUNT LOOP /*循环从此开始*/

FETCH C1 INTO SHIPMENT_NO_TMP, ARRIVAL_DATE_TMP,DELIVERY_REF_1_TMP, DELIVERY_REF_3_TMP,DELIVERY_ REF_2_TMP,CASE_NO_TMP,

LRCM_CODE_TMP,ANN_QUANTITY_TMP,

QUANTITY_DESCRIPTION_TMP,SPARE_PART_TMP, TRANSFER_NUMBER_TMP,TRANSFER_DATE_TMP; EXIT WHEN C1%NOTFOUND OR C1%NOTFOUND IS NULL;

/*下面是EXCEL.XLS文件的CELL, 如'R2C2'就是第二行第二列*/ CROW:=I+1;

CCOL1:='R'||CROW||'C1'; CCOL2:='R'||CROW||'C2'; CCOL3:='R'||CROW||'C3'; CCOL4:='R'||CROW||'C4'; CCOL5:='R'||CROW||'C5'; CCOL6:='R'||CROW||'C6'; CCOL7:='R'||CROW||'C7'; CCOL8:='R'||CROW||'C8'; CCOL9:='R'||CROW||'C9';

TEMP:=ANN_QUANTITY_TMP; /*NUMBER型数据要先转化为varchar型*/

DDE.Poke(ConvID, CCOL1, SHIPMENT_NO_TMP, DDE.CF_TEXT, 2000000000); /*日期型要用tochar()进行转换*/

DDE.Poke(ConvID, CCOL2, TO_CHAR(ARRIVAL_DATE_TMP), DDE.CF_TEXT, 2000000000); DDE.Poke(ConvID,CCOL3,DELIVERY_REF_1_TMP ||DELIVERY_REF_3_TMP|| DELIVERY_REF_2_TMP||

CASE_NO_TMP, DDE.CF_TEXT, 2000000000); DDE.Poke(ConvID, CCOL4, LRCM_CODE_TMP, DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL5, SPARE_PART_TMP, DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL6, TRANSFER_NUMBER_TMP, DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL7, TO_CHAR(TRANSFER_DATE_TMP), DDE.CF_TEXT, 2000000000);

DDE.Poke(ConvID, CCOL8, TEMP, DDE.CF_TEXT, 2000000000); DDE.Poke(ConvID, CCOL9, QUANTITY_DESCRIPTION_TMP, DDE.CF_TEXT, 2000000000);

END LOOP; CLOSE C1;

DDE.Terminate(ConvID);

/*结束DDE会话,此时数据已经全部倒入到EXCEL文件中了*/ END;

在做好以上工作后, 编译运行该fmx文件, 此时确保打开excel.xls文件,用鼠标点击按钮,然后将焦点移到excel.xls文件中,你就会发现一行行数据正在被倒入到EXCEL文件中,等完成后, 将EXCEL文件保存起来就可以了.

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

---- 一个应用系统往往有不同的用户,比如: 一个劳资系统中,一个用户负责管理职工基本档案部分,另一个用户负责管理职工工资部分,管理职工基本档案的用户对职工档案只有查询的权限而不能有修改的权限。实现上述功能的一个简单的实现办法是:

---- 设置两个全局变量分别记录用户名和密码,在进入系统时,两个用户分别输入不同的用户名和密码,判断用户名,使SET_MENU_PROPERTY(MENU1,ENABLED,FALSE)语句设置没有查询权限的用户不能访问菜单项'MENU1'。

37 提高表连接的查询速度

在表连接查询时,常常用下列查询方法查询数据是: 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';

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

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

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

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

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

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

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

ORACLE REPORT2.5提供了多种报表格式,但在报表中定义各种统计信息不仅繁琐而且不利于今后的维护,使用视图预先将各种统计、汇总数据准备好,可以起到事半功倍的作用,一旦数据源有所调整,只需修改后台视图,而不用再改前端程序了。

表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'建立报表。

41 给报表加序号的简单办法

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

联系合同范文客服:xxxxx#qq.com(#替换为@)