作为世界最大的电子商务解决方案供应商,Oracle拥有业界领先的技术,广泛的第三方应用支持以及Informix用户所需要的全部业务能力。数据库平台是所有电子商务解决方案的基础,即将正式面市的Oracle9i数据库是一个功能完善、应用简单的数据库产品,拥有全部来自Oracle的设计、市场营销、销售与服务的强力支持,为用户构建电子商务环境提供了完整的集成功能。
摘 要:数据库在软件开发中发挥着重要的作用,本文指出不同数据库间数据移植的需要,以Oracle、Informix 数据库为例,首先比较了两种数据库之间的区别,指出数据移植的关键问题,提出了一个从Oracle 到informix 的数据移植解决方案。 关键词:数据移植;Oracle;
1.引言随着计算机技术的应用普及,数据库技术的应用也越来越广泛,各种应用软件高效、正常、安全运行的关键技术在于数据库技术,数据库是软件系统的核心部分,其作用不言而喻。软件系统需要不断的升级更新,在这个过程中,由于各种原因,如特定数据库需求的提出、软件开发环境的更改、软件开发商的更换,出现了不同数据库间数据移植的需求,不同数据库之间的移植是经常让数据库管理员头疼的问题。数据库移植不仅仅是导出导入的过程,由于新旧运行平台、操作系统、应用设备等的不同,其中涉及的问题方方面面,在这个过程中,数据准确、完整的移植是项目成功的关键之一。数据的移植要花费大量的时间,如果失败,不仅等于做了无用功,重要的数据也会丢失,整体移植过程至少分成两个不同的阶段,根据依赖关系分割成若干小的关系链,通过安全渐进的步骤完成移植过程。尤其是大型企业动态现网数据的移植,要保证两个数据库系统间数据无缝连接、无误地运行,需要不断地进行测试,即时发现问题,把风险降到最低。数据库系统之间的移植非常复杂,不同的关系数据管理系统之间存在着结构等方面的差异。用来描述Oracle 结构的用词和术语通常与该词在Informix 中的意思完全不同。同时,racle 和Informix 都对SQL 标准做了许多自有的扩展。从应用程序开发人员的观点来看,Oracle 和Informix 是以相似的方法来管理数据的,但是在Oracle 和Informix 之间有内部差异,但是如果管理得当,可以把这些差异对移植的影响减到最小。2.数据移植步骤研究以UNIX 下Oracle 到Informix 异构数据库的数据移植为例,从软件工程学的角度,可以将数据迁移分为三个阶段:第一准备阶段:在数据移植前必须进行全面的分析和对比,从数据类型、函数、SQL 等方面进行比较,找出不同数据库间的差别,修改数据库创建脚本,建立Informix 数据库,编写移植脚本并测试准确性,修改相应的数据存取脚本,保证数据准确地存取,从而支持前台的应用;第二阶段数据测试阶段:经过前面的准备,搭建测试环境,对少量数据进行测试,尽可能的发现问题,为最终的数据移植做准备,利用sql plus导出原有的数据,分表保存文件,一个表一个数据文件,最后在UNIX 环境下通过dbaccess运行数据导入脚本,导入数据,实现最终的数据移植。第三阶段数据维护阶段:由于有些问题不能考虑周全,可能在移植后出现一些没有预料的问题,为了保证数据的准确运行,需要进行数据跟踪,并根据前台的具体业务来检测数据,同时做好数据备份,以便进行数据恢复。3.Oracle 到Informix 数据移植关键3.1 数据类型转换不同的数据库支持不同的数据类型,数据移植的一个重要方面就是要保证数据的一致性,其中的一个难点就是保证数据类型范围的一致性. Oracle、Informix 都属于大型关系数据库管理系统,但支持不同的数据类型.因此在移植过程中必须根据二者的数据类型进行相应的转换、替代,比较了两者之间的异同处,可以重用原有的SQL 语句,根据不同点进行修改,减少了工作量。当然在移植过程中也并非所有的数据类型都能保证一致,所以在实际移植过程中,要根据实际情况进行处理。
Oracle 与Informix 基本数据类型
ORACLE INFORMIX
number decimal
varchar2 varchar
date Date/datetime
没有序列类型 Serial
1、日期字段的处理Oracle 日期字段只有DATE,包含年月日时分秒信息,格式是DD-MON-YY HH:MI:SS,Informix 的日期时间格式Datetime/Date, Datetime 精确到秒,Date 为日期。要实现数据的准确移植, 可以通过修改实例的参数NLS_DATE_FORMAT,可以改变实例中插入日期的格式。在一个会话期间,可以通过Alter session SQL 命令来修改日期:alter session set NLS_DATE_FORMAT ='yyyy-mm-dd hh24:mi:ss',或者通过使用SQL 语句的TO_DATE 表达式中的参数来更新一个特定值。2、自动增长的数据类型处理ORACLE 没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 CYCLE NOCACHE; 其中最大的值按字段的长度来定, 如果定义的自动增长的序列号 NUMBER(6) , 最大值为999999 INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL ;Informix 有自动增长的数据类型Serial,插入记录时不用操作此字段,会自动获得数据值。不同的数据库都内置不同的系统函数,这些函数能为数据库开发人员提供便利,可以缩短开发周期,提高开发效率.如时间函数、字符转换函数、合计函数等.不同的数据库厂商,他们提供的系统函数在格式,语义和语法上是不同的,从Oracle 到Informix 的移植,同样必须进行函数的转换。3.2 SQL 语句的调整1、数据存储格式在数据移植过程中,为了保证数据的完整性,对数据的移植一般是分表进行,一个表一个文件,数据移植最重要的过程就是数据格式的转换,由于Oracle 是以空格来分隔格列-3-数据,而Informix 则是以“|”来分隔数据,所以必须改变数据的分割格式,可以用数据连接符||将各列数据连接导出,在连接中增加数据分隔符“|”:列1||'|'||列2||'|'||列3||'|'…'|'||列n.2、数据表外连接在数据移植时,多表的连接问题也需要重新处理,因为Oracle 外连接适用(+)来标识的,而informix 则是用outer 关键字加在表名前实现的。(+)在左是右连接,反之亦然,(+)所在侧表明该列不存在时,可以为空,例如:Oracle 中select a.id,b.id from a,b where a.name=b.name(+);Informix 中:select a.id,b.id from a,outer b where a.name=b.name;ANSI 中:select a.id,b.id from a left outer join b on a.name=b.name;3.3 扩展SQL 语句的调整数据库之间存在异构的一个很重要的方面表现在:存储过程,触发器,游标等扩展SQL 的定义.这些扩展SQL对象往往是由不同的数据库厂商在遵循标准SQL的基础上进行了自己的扩充,故语法格式各不相同,所以在进行数据或系统的移植时,面临的一个很大的难题就是这些扩展对象的移植. Oracle 和Informix 都支持存储过程,但两者提供的扩展函数不同,变量的声明,存储过程的定义,调用格式是不同的,比如,Oracle 的存储过程:CREATE OR REPLACE PROCEDURE login_error_count(user_name_var varchar2) ISerror_count_var INTEGER;BEGINSELECT error_count INTO error_count_var FROM users WHERE user_name=user_name_var;error_count_var :=error_count_var+1;UPDATE users SET error_count= error_count_var WHERE user_name =user_name_var ;COMMIT;END login_error_count;移植到Informix 的存储过程为:DROP PROCEDURE login_error_count;CREATE PROCEDURE login_error_count(user_name_var varchar(50)))DEFINE error_count_var INTEGER;BEGINSELECT error_count INTO error_count_var FROM users WHERE user_name=user_name_var;LET error_count_var=error_count_var+1;UPDATE users set error_count= error_count_var WHERE user_name =user_name_var ;END PROCEDURE;1、Oracle 存储过程执行为EXECUTE 存储过程名或EXEC 存储过程名;Informix 存储过程执行为EXECUTE PROCEDURE 存储过程名;2、变量的定义格式不同:Oracle :变量名 数据类型Informix: define 变量名 数据类型3、存储过程的声明标题格式不同Oracle :CREATE OR REPLACE PROCEDURE 过程名(变量名 数据类型)ISInformix :CREATE PROCEDURE 过程名(变量名数据类型)4、Informix 不需要commit;
4.结束语笔者结合项目经验,提出了UNIX 下Oracle 到informix 数据移植的步骤与方案,介绍了Oracle、informix 的之间在数据类型、SQL 语句的区别,并在实际中稳定运行,为以后异构数据库移植研究提供了参考。