作者:哈尔滨工业大学法院街13号 1226信箱(150001) 徐淑锋 左
美云
Oracle系统使用方便,功能强大,便于维护,安全性好。经过十多
年的发展,已成为功能最齐全的、最受欢迎的关系数据库管理系统。
它不但成功地运行在大型机上,而且在小型机和微型机上也广泛使用
。笔者在开发过程中积累了一些实用技术,在这里挑选几条与大家交
流。
一、Foxbase 与Oracle数据库的双向转换技术
DBaseⅢ、FoxBase曾是国内外应用广泛的数据库系统,很多企业
单位都以此建立了自己的管理信息系统。随着Oracle在国内的推广,
特别是一些大型的企业需要开发新型的基于Oracle RDBMS的网络管理
系统,以适应管理发展与企业规模扩大的需要。在新旧系统转换的过
程中,我们希望能够充分利用已有的数据库资源,避免重复输入。为此
,我们使用了PRO*C程序,在DOS环境下执行经过PRO*C预编译、MSC编译
和联接后形成的.EXE文件,直接将.DBF数据库文件转入相应的Oracle
表中。
通过对.DBF为文件结构的剖析,在Oracle数据库中建立具有相应
列(Column)的数据表。具体做法是:根据.DBF库文件各字段的定义,生
成一个字符串,用PRO*C的动态定义语句EXECUTE IMMEDIATE执行SQL语
句"CREATE TABLE",在Oacle数据库中建立一个数据表,然后通过循环
语句把由.DBF文件读出的记录数据加入到Oracle数据表中。在循环体
中,按数据文件的格式,每次读取一条记录,并转换为合适的字符串,运
用PRO*C的动态定义语句EXECUTE IMMEDIATE执行SQL语句"INSERT IN-
TO",把读出的数据插入数据表中。
反过来,Oracle数据库也可以转换到FoxBase数据库。思路是:先
从Oracle的数据字典中取出表定义、字段定义;再按照.DBF库文件的
存储结构,直接生成.DBF库文件的标识部、字段描述部,用Oracle表字
段的相应数据填写;最后将Oracle表中的记录写到生成的FoxBase数据
记录体域,从而实现了Oracle数据库与FoxBase数据库的双向转换。
二、巧用文本编辑软件提高Oracle开发效率
Oracle系统的文本编辑功能及全屏幕编辑功能并不太尽人意,在
系统开发过程中,我们如能结合使用国内流行的文本编辑软件(如CCED
、WPS等),会收到更好的效果。
1、建立基表
SQL*PLUS是一种非过程化的交互式命令语言,在该环境下,键入的
SQL命令被保存在SQL缓冲区中,新键入的语句将冲掉上一次键入的语
句,而且,在SQL*PLUS下,只能用命令I、C、D、A进行行编辑,不能进行
全屏幕编辑,而建立一个基表要定义许多字段,命令输入中难免发生错
误,这给开发者增加了难度。
解决的方法是:用文本编辑软件建立一个扩展名.SQL的命令文件,
文件中应包含建表命令"CREATE TABLE";然后,在SQL*PLUS下用START
命令运行该文件,如有错误可再回到文本编辑状态下修改。
这种方法很适合开发初期建立大量的基表、视图。通过充分利用
文本编辑软件中的块复制、行复制等功能,可大大减少输入工作量。
2、更新FORM
建立FORM时通过人机对话的方式,产生两类文件:一类是INP文本
文件,记录了人机对话的内容及FORM的格式;另一类是FRM可执行文件,
此文件是用IAG对INP文件编译后生成的。
在生成FORM的过程中,如果人机对话有误或屏幕格式需调整,只需
用文字编辑软件对INP文件进行修改,修改后用IAG命令进行编译即可,
不必重新进行整个FORM的设计。如果在已做好的FORM中有些块定义和
需要做的FORM中块定义完全相同,就可以把已有的INP文件拷贝过来直
接使用,此方法为FORM的建立提供了一种快速有效的途径。
所以,文本编辑软件的有效使用,增加了Oracle系统应用开发的灵
活性。
三、PRO*C程序调试过程中的出错检验技巧
在PRO*C程序中,使用SQL语句对数据库数据进行操作时,并不能保
证每个SQL语句一定能执行成功,而这种导致SQL操作不成功的错误在
预编译、编译和连接过程中却又常常发现不出来。为了解决SQL语句
的出错检验问题,我们在程序中利用通讯区SQLCA返回的信息来检测SQ
L语句的执行情况。
在PRO*C程序开头使用了"EXEC SQL INCLUDE SQL-CA"语句,它包
含名为SQLCA的文件,在SQLCA文件中定义了sqlca的结构:
struct sqlca{
char sqlcaid[8];
long sqlcabc;
long sqlcode;
struct{
unsigned short sqlerrml;
char sqlerrmc[70];
} sqlerrm;
char sqlerrp[8];
long sqlerrd[6];
char sqlwarn[8];
char sqlext[8];
};
struct sqlca sqlca;
sqlca是个结构变量,系统将SQL语句执行情况的信息存入到相应
的结构成员中。其中,sqlca.sqlcode中存放的是出错代码,规定:
=0 表示执行成功,
sqlca.sqlcode +1043表示"No row found"或返回的是基表中
最后一行,
在子结构sqlca.sqlerrm中存放出错的正文信息,其中:
sqlca.sqlerrm.sqlerrmc:存放对应 sqlca.sqlcode中出错代码
的正文信息;
sqlca.sqlerrm.sqlerrml:存放正文信息的长度。
所以,程序调试过程中,我们只要在需要高度的SQL语句后面加上
如下的一段程序:
printf("sqlcode is :%d\n",sqlca,sqlcode);
if sqlca.sqlcode
printf("sqlca.sqlerrm is:%s\n",sqlca.sqlerrm.sqler-rmc
);
exit(0);
}
我们根据sqlca.sqlcode的值判断SQL是成功。根据sqlca.sqlerr
m的内容判断错误的原因,对程序进行重新的修改,从而提高了程序检
测的效率。
四、运用动态语句实现程序通用设计
Oracle数据库管理系统提供了四种类型的动态语句:
A:非查询的无参数动态语句
B:非查询的带参数动态语句
C:查询动态语句
D:使用描述符的动态语句
在程序中,将一个SQL语句放到一个字符串变量之中,利用动态语
句即可将该SQL语句执行。因此,在应用系统设计过程中,只要变换作
为SQL语句的字符串内容便可执行不同的SQL语句。如果SQL语句字符
串从磁盘文件中读来,那么,只要改变该磁盘文件的内容,就能动态地
控制SQL语句的执行内容,而不需对应用程序作任何改变,正是由于这
个特点,使得程序通用设计成为一种可能。
用动态语句,我们就可以通过键盘方式或其它方式改变SQL语句,
运用一个程序完成对不同基表的数据插入、删除、修改和查询,特别
是通用报表打印的设计中,更体现了动态语句的特点。在设计过程中,
我们不把表头、表尾及表的格式这些难以调整和维护的内容限定在程
序语句中,而是把它加入到动态查询程序中。在维护报表系统时,我们
同样不用修改报表程序。同时,在程序加入"用户出口"调用别的可执
行程序或DOS操作系统命令,用以完成一些通用程序本身所完成不了的
功能,从而提高了通用程序的实用价值。
除上述四条经验之外,对于如何解决一屏多记录分块设置,零页的
使用及快速查找当前记录,合理解决分区空间不足等问题,由于篇幅所
限,就不一一详述了。