作者:哈尔滨工业大学法院街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"或返回的是基表中 最后一行, <0 表示SQL执行不成功,程序有错或系统故障。 在子结构sqlca.sqlerrm中存放出错的正文信息,其中: sqlca.sqlerrm.sqlerrmc:存放对应 sqlca.sqlcode中出错代码 的正文信息; sqlca.sqlerrm.sqlerrml:存放正文信息的长度。 所以,程序调试过程中,我们只要在需要高度的SQL语句后面加上 如下的一段程序: printf("sqlcode is :%d\n",sqlca,sqlcode); if sqlca.sqlcode<0 { 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操作系统命令,用以完成一些通用程序本身所完成不了的 功能,从而提高了通用程序的实用价值。 除上述四条经验之外,对于如何解决一屏多记录分块设置,零页的 使用及快速查找当前记录,合理解决分区空间不足等问题,由于篇幅所 限,就不一一详述了。
|