Oracle EBS数据定义移植工具:Xdf(XML Object Description File)
九月 29, 2009 in Oracle EBS二次开发
Oracle EBS二次开发中,往往会创建很多数据库对象,如表、同义词、视图等,这些数据库对象是二次开发配置管理内容很重要的一部分,通常情况下我们会使用脚本文件来记录这些数据库对象的创建、变更和维护,随着开发的进行需要对这些对象的脚本进行版本管理;更重要的是将这些数据库对象从开发环境移植到其它环境的时候面临着诸多的问题:
- 数据库对象本身并没有实现版本管理
- 需要安装人员执行多个数据库对象脚本
- 安装人员必须了解一定的数据库知识才能执行脚本
- 脚本的安装的方式容易出错,如果设计的脚本和目标系统有所出入,很有可能导致更新出错或带来灾难
- 需要分别为多个目标系统定制安装脚本,工作量非常大
- 脚本的格式没有统一的标准
作为开发人员很希望有一个工具来完成数据库对象在两个数据库之间的移植,而无需我们为了不同的数据库维护不同的对象脚本,避免上面所描述的问题,下面我们来看看Oracle为我们所提供的解决方案: XDF(XML Object Description File)工具。
XDF工具的原理和FNDLOAD是一样的,同样是从源系统中获取需要移植对象的元数据信息后生成数据文件(.xdf),然后在目标系统中使用数据文件根据目标系统的情况生成相应的操作来新增或者修改数据库对象。
目前版本的Xdf(EBS R12.1.1)可以完成以下数据库对象的移植:
- Table
- Index
- View
- Sequence
- Synonym
- Mview
- Mviewlog
一、ODF(Object Description File)介绍
在讲解XDF工具之前我们必须先了解一下它的前身ODF(Object Description File),ODF是在11i之前Oracle为EBS系统提供的数据库对象移植工具,它有两个组件组成:
1. ODF Generator(adodfgen):用来从源系统中生成数据库对象的描述信息文件(.odf),如生成PO_HEADERS_ALL这个表的定义信息。但是这个工具作为Oracle内部使用从来没有对外公开过,致使我们无法使用这个工具,我们所能够得到的odf数据文件都是Oracle作为补丁类型提供给我们的,因此对于我们二次开发移植来说根本无法使用ODF这个工具。
2. ODF Comparison(adodfcmp):用来在目标系统中通过对比odf数据文件和目标系统数据库中对象来生成并执行相应命令,odf文件中包括了数据库对象所有的信息,如果它发现目标系统中不存在这个对象的时候就创建它;如果目标系统中已经存在这个对象并版本低于odf文件中描述的对象就修改对象的定义。这个工具在很多补丁或者Oracle解决问题的时候会用来进行odf数据文件的对比操作。
adodfcmp可以在$AD_TOP/bin目录下找到, 由于并不是经常使用,在此就不做更多详细介绍,有兴趣的可以在命令行中输入 adodfcmp命令后回车可以看到使用的说明
使用的例子:
adodfcmp mode=sequences priv_schema=system/manager userid=gl/gl touser=apps/apps odffile=glxx.odf changedb=Yes
adodfcmp mode=tables priv_schema=system/manager userid=gl/gl touser=apps/apps odffile=glxxx.odf changedb=Yes
adodfcmp mode=views priv_schema=system/manager userid=gl/gl touser=apps/apps odffile=glxxx.odf changedb=Yes
虽然Oracle并未公开ODF工具供我们使用,但是Oracle内部看似还在使用它,在EBS R12版中可以看到很多模块中还有odf数据文件提供,odf数据文件一般在各模块的 patch/115/odf 目录下
二、Xdf(XML Object Description File)
在Oracle EBS 11i之后,Oracle结合了Java和XML的技术推出了XDF这个数据库对象移植工具作为ODF的接班,XDF作为FND模块中的一个工具组件出现,XDF的Java实现在$JAVA_TOP/oracle/apps/fnd/odf2 目录下,它的原理和ODF以及FNDLOAD是一样的,只是XDF不像FNDLOAD那样需要控制文件而已。
但是在EBS R12之前,Oracle并未公开XDF生成工具(FndXdfGen),所以也无法用来移植客户化的数据库对象,直到R12发布的时候,FndXdfGen终于向我们开放了,至此我们终于可以在二次开发中使用Xdf这个工具。
XDF工具由2个组件构成:
- 对象描述生成工具(FndXdfGen):用来从源系统中生成数据库对象的描述信息文件(.xdf)
- 对象对比工具(FndXdfCmp):用来在目标系统中通过对比odf数据文件和目标系统数据库中对象来生成并执行相应命令,它是Xdf工具的核心
1,对象描述生成工具(FndXdfGen)
Xdf生成工具是用来从源数据库系统中将描述数据库对象的元数据信息从数据字典中取出后生成odf文件的工具,它通过Java类oracle.apps.fnd.odf2.FndXdfGen来实现
语法如下:
java oracle.apps.fnd.odf2.FndXdfGen apps_schema= apps_pwd= jdbc_protocol= jdbc_conn_string= object_name= xsl_directory= [object_type=] [owner_name=] [xdf_filename=] [deferred=<yes|no|> ] [logfile=] [dropcr=] [custom_defval=colname1=col1value;colname2=col2value] [includetriggers=][obsolete=][base_partition=][apply_dbversion=]
关键的几个参数:
- apps_schema:apps模式名称,一般为apps
- apps_pwd:apps模式的密码
- jdbc_conn_string:数据库连接信息,可以使用Net8格式的连接或者hostname:port:sid的格式
- object_name:指定要导出信息的数据库对象名称,trigger和sequence两种类型可以使用百分号(%)来一次性提取多个,其它类型需要明确指定名称,一次提取一个对象
- xsl_directory:用来做XSLT转化时所要求的xsl文件目录,通常使用$FND_TOP/patch/115/xdf/xsl 或者 $FND_TOP/admin/xdf/xsl
- jdbc_protocol:jdbc协议(thin 或 oci8)
- object_type:导出的对象类型,有table, mview, mviewlog, index, view, sequence, synonym
- owner_app_shortname:对象所属的应用简称
- xdf_filename:生成的对象描述文件名称,名称自动添加后缀”.xdf”
其它参数可以直接在命令行中输入java oracle.apps.fnd.odf2.FndXdfGen 后打印出来看
下面以移植 xhu.xhu_blog_article_2201 表为例来演示如何使用XDF工具,使用appl操作系统用户登录到EBS中间服务器,运行如下的命令:
java oracle.apps.fnd.odf2.FndXdfGen apps_schema=apps apps_pwd=apps jdbc_protocol=thin jdbc_conn_string=ebs006.hand-china.com:1522:VIS02 object_name=XHU_BLOG_ARTICLE_2201 xsl_directory=$FND_TOP/patch/115/xdf/xsl owner_app_shortname=XHU object_type=table
命令正常执行后会看到如下的日志信息输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Generating xdf - xhu_blog_friend_2201.xdf
The xdf file contains the following objects
Primary Object's Application Short Name :
XHU
Primary Object Schema Name :
XHU
Primary Object Name :
XHU_BLOG_FRIEND_2201
Primary Object Type :
TABLE
Dependent Object Information :
Indexes on XHU_BLOG_FRIEND_2201 :
XHU_BLOG_FRIEND_2201_U1
None
Sequence(s) on XHU_BLOG_FRIEND_2201 :
XHU_BLOG_FRIEND_2201_S
Policy(ies) on XHU_BLOG_FRIEND_2201 :
None
Created xdf successfully |
从上面的日志信息中可以看到表、表上的索引、表的序列(按照<table_name>_s格式创建)和表的策略都一并导出,成功执行后会生成对象描述文件xhu_blog_article_2201.xdf,生成的对象描述文件(.xdf)是XML结构的,有兴趣的可以用记事本打开看看里面的内容。
对象描述文件记录信息的特点:
- 以XML格式描述对象信息
- 将相关联的对象一起提取出来,如表上的索引、策略和触发器等
- 不管在源系统中数据库表是否注册到EBS,生成描述信息都包含了这的信息
- 对象都具有自己的版本号,如表和表中的列都有自己的版本号
- 对象都有哈希值
系统中很多数据库对象的描述文件都保存在各模块的 patch/115/xdf 目录下
2,对象对比工具(FndXdfCmp)
FndXdfCmp是Xdf工具的核心组件,它根据对象描述文件(.xdf)中对象的信息,并根据目标数据库中对应对象的存在情况来生成对应的DDL语句,例如表对象,如果在目标系统中不存在,那就生成CREATE TABLE语句,否则就生成ALTER TABLE语句。
FndXdfCmp根据对象描述文件的内容、目标系统的对象存在情况以及对象类型来生成相应的DDL语句,整个XDF工具的魅力也就在此,不管存在多少个目标系统,我们移植时只需要一个对象的描述文件(.xdf),剩下的事情全部交给XDF对比工具(FndXdfCmp)去为我们完成。
FndXdfCmp使用语法:
java oracle.apps.fnd.odf2.FndOdfCmp < schema_name> < schema_Pwd> < apps_schema> < apps_pwd><jdbc_protocol> <jdbc_conn_string> <object_type> <xdf_filename> <xsl_directory> [CLONE_UN=<apps_clone_schema_id> CLONE_PW=<apps_clone_schema_password> SPEC_UN=<table_specs_schema_id> SPEC_PW=<table_specs_schema_password>] <xsl file Dir>[deferred=<list>] [dropCr=<list>] [logfile=<filename>] [changedb=<y/n>] [data_sec_vpd=<y/n>] [parallel_index_threshold=<block count>] [index_category=<small/large/both>]
关键的几个参数:
- schema_name:对象所属模式的名称
- schema_pwd:对象所属模式的密码
- jdbc_protocol:jdbc协议(thin 或 oci8)
- jdbc_conn_string:数据库连接信息,可以使用Net8格式的连接或者hostname:port:sid的格式
- object_type:对比的对象类型,有table, mview, mviewlog, index, view, sequence, synonym
- xdf_filename:对象描述文件的名称
- xsl_directory:用来做XSLT转化时所要求的xsl文件目录,通常使用$FND_TOP/patch/115/xdf/xsl 或者 $FND_TOP/admin/xdf/xsl
其它参数可以直接在命令行中输入java oracle.apps.fnd.odf2.FndXdfCmp后打印出来看
将xhu.xhu_blog_article_2201表的数据文件传到目标系统下,使用appl操作系统用户登录到EBS中间服务器,运行如下的命令来将xhu.xhu_blog_article_2201表移植到新的环境中:
java oracle.apps.fnd.odf2.FndXdfCmp XHU XHU APPS APPS thin ebs12.hand-china.com:1522:VIS04 table xhu_blog_article_2201.xdf $FND_TOP/patch/115/xdf/xsl
使用Xdf移植的数据库表会自动注册到EBS里面,即注册到FND_TABLES表中,成功执行后可以登录数据库查看数据库对象的情况,
SELECT * FROM dba_objects WHERE object_name = upper(‘xhu_blog_article_2201′);
SELECT * FROM fnd_tables WHERE table_name = upper(‘xhu_blog_article_2201′);
3,Xdf使用步骤
一般二次开发过程中都需要从开发环境将数据库对象移植到其它环境,或者标准化开发完成的程序安装到客户环境中,使用Xdf工具的步骤:
- 在开发环境中设计好数据库对象
- 使用描述对象生成工具FndXdfGen生成数据库对象的描述文件(.xdf)
- 将对象描述文件传到目标环境下或者打包发给相关人员
- 运行对象对比工具FndXdfCmp来在目标数据库中生成对象或修改对象
这样一来移植工作就完成了,通过Xdf工具来进行数据库对象的移植,整个移植的核心纽带则转移到了对象描述文件(.xdf)上面,而这个文件只是以XML的方式记录了对象的信息,和目标系统没有任何关系,这样使数据库对象的移植变得灵活简单并高效。
相关文章:

pjf said on 十月 8, 2009
正用到,谢谢老大
aronezhang said on 十月 8, 2009
很奇怪pjf的留言不出现在全站活动中
pjf said on 十月 9, 2009
我是直接用名称加Email留的言,没登陆。所以没出现吧
闪闪 said on 九月 30, 2009
原来是这样啊。。。我是看到你和徐翔轩在上边的讨论,才问一问的。嘿嘿。。。
闪闪 said on 九月 29, 2009
如果使用FNDLOAD,就需要定义自己的lct文件了?那其中使用到的define,download,upload‘脚本’,不知道‘脚本’叫法正不正确,这个‘脚本’也需要我们来学习了,是不是??
aronezhang said on 九月 29, 2009
@ganshanshan007, FNDLOAD应该到另外一个贴去发表啊,客户化开发的表中数据一般不太可能出现要重复移植的可能性,因此不太需要采用FNDLOAD,进而也不需要自己编写lct文件,而系统标准的数据移植,那只要到各模块下去寻找lct文件即可。
闪闪 said on 九月 29, 2009
如果使用xdf能直接把数据都移植过去就好了也没有必要这么麻烦!!
aronezhang said on 九月 29, 2009
@ganshanshan007, 关于对象移植和数据移植可以说是天差地别的事情,复杂度完全也不一样,需要考虑的因素也是不一样的
它们是不应该放在一起的
aronezhang said on 九月 29, 2009
对于非EBS的Oracle数据库,clob和blob类型可以使用Oracle的exp/imp工具,如果使用dblink是没有办法直接导入到表的,需要像11所说先到global temperary后再转入正式表。
而对于EBS的Oracle数据库,R12.1.1开始FNDLOAD已经支持clob和blob对象的,可以使用它来进行数据的移植。
Eleven.Xu said on 九月 29, 2009
哦,原来如此,现在还没用过Xdf,看来要尝试使用一下:)
这几天项目上线,我在往正式环境导入数据时,发现clob和blob类型的数据处理起来比较麻烦,为了简化我采用了在脚本中创建dblink,以及global temperary table,首先将数据导入到刚创建的临时表中,再由临时表导入到正式环境的表中,完成后删除临时表与dblink,不知这样的方式是否可取?
aronezhang said on 九月 29, 2009
11要注意,Xdf只是对象的移植,并不移植如表这样对象中的数据,因此数据类型对它是没有影响的。
Eleven.Xu said on 九月 29, 2009
如果表中包含有CLOB或BLOB类型的数据时使用Xdf工具进行数据库对象的移植也可以吗?