Oracle EBS数据定义移植工具:FNDLOAD
九月 27, 2009 in Oracle EBS二次开发
在实际的EBS二次开发中,我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义,如在EBS二次开发中并发请求的定义会涉及到:可执行、并发程序、值集、请求组等的定义,定义需要从开发环境、测试环境、UAT环境一直到正式环境,开发人员完成一个并发请求开发后,同样的定义需要在多个环境中手工完成,势必导致中间出现错误,导致浪费很多时间来进行检查,无形中增加了工作量;而更多的时候系统管理人员和开发人员是分离的,开发人员和系统管理人员之间还需要进行任务的交接,进一步增加了程序移植工作的难度和工作量。
而FNDLOAD则是为了移植EBS数据定义而诞生的工具,它可以移植定义在AOL中的数据定义,如我们常见的并发程序、值集、预置文件等等,严格来说它可以实现任意两个Oracle数据库之间数据的移植,有了这个工具,我们就无需在多个环境中重复进行手工定义了。
在Oracle EBS环境下,和FNDLOAD工具类似的移植工具随处可见,并被广泛应用,如用来移植BI Publisher报表模板定义的XDOLoader工具;工作流定义移植工具WFLOAD;数据库对象移植工具ODF和XDF.
04年在做一个项目的时候,我简单写过一个通过FNDLOAD工具在多个EBS环境间移植程序定义的文档,其中主要描述了如何使用FNDLOAD将AOL模块中的数据从一个环境移植到另一个环境,下面将从如何掌握并应用FNDLOAD这个工具的角度补充说明。
一、FNDLOAD介绍
数据移植的目的无非是将一个EBS系统下数据库中的某个表中的数据按照条件筛选出来后传到另外EBS系统下数据库中对应的表中。FNNDLOAD的根本原理就是将数据从源数据库中下载到数据文件中,然后再通过FNDLOAD将数据文件上传到目标数据库中。
由于两个数据库系统不能保证是连接的,无法采用Oracle的DBLink技术,因此FNDLOAD采用了数据文件作为两个系统间传递的中介,而为了完成数据的下载和上传,FNDLOAD引入了控制文件(lct):用来定义移植那张表中的数据列,并分DOWNLOAD和UPLOAD模式定义数据抽取和更新的逻辑,DOWNLOAD用在源数据库环境下,UPLOAD应用于目标数据库环境下。
控制文件是FNDLOAD工具的核心,下面我们来分析一下并发请求移植的控制文件($FND_TOP/patch/115/import/afcpprog.lct)的部分内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | #
# $Header: afcpprog.lct 120.2.12010000.2 2008/11/21 14:26:27 jvalenti ship $
#
# .lct - Loader Configuration
#
# Entities -
#
# PROGRAM
# INCOMPATABILITY
#
# VALUE_SET (non-MLS) -- Value sets
# | - FND_FLEX_VALUE_SETS
# +--VSET_SECURITY_RULE (MLS) -- Value Security Rules
# | | - FND_FLEX_VALUE_RULES
# | | - FND_FLEX_VALUE_RULES_TL
# | +--VSET_SECURITY_LINE (no-TL) -- Value Security Rule Lines
# | | - FND_FLEX_VALUE_RULE_LINES
# | +--VSET_SECURITY_USAGE (no-TL) -- Security Rule Assignments to
# ....
#
# ----------END FLEX----------
#
# -- DEFINE SECTION --
#
#
# ==================================================
# Executable
# ==================================================
DEFINE EXECUTABLE
KEY EXECUTABLE_NAME VARCHAR2(30)
KEY APPLICATION_SHORT_NAME VARCHAR2(50)
CTX OWNER VARCHAR2(4000)
BASE LAST_UPDATE_DATE VARCHAR2(75)
BASE EXECUTION_METHOD_CODE VARCHAR2(1)
BASE EXECUTION_FILE_NAME VARCHAR2(61)
BASE SUBROUTINE_NAME VARCHAR2(30)
BASE EXECUTION_FILE_PATH VARCHAR2(510)
TRANS USER_EXECUTABLE_NAME VARCHAR2(240)
TRANS DESCRIPTION VARCHAR2(240)
END EXECUTABLE
DEFINE PROGRAM
KEY CONCURRENT_PROGRAM_NAME VARCHAR2(30)
KEY APPLICATION_SHORT_NAME VARCHAR2(50)
CTX OWNER VARCHAR2(4000)
BASE LAST_UPDATE_DATE VARCHAR2(75)
TRANS USER_CONCURRENT_PROGRAM_NAME VARCHAR2(240)
BASE EXEC REFERENCES EXECUTABLE
......
END PROGRAM
#
# -- DOWNLOAD SECTION --
#
# For each entity, specify the SQL statement to use to flesh out
# its entity definition. SELECT columns must be in same order and
# datatype as the entity's attributes as defined above.
#
# PROGRAM
DOWNLOAD PROGRAM
"select v.CONCURRENT_PROGRAM_NAME,
a.APPLICATION_SHORT_NAME,
fnd_load_util.OWNER_NAME(v.LAST_UPDATED_BY) OWNER,
to_char(v.LAST_UPDATE_DATE, 'YYYY/MM/DD') LAST_UPDATE_DATE,
v.USER_CONCURRENT_PROGRAM_NAME,
....
from fnd_concurrent_programs_vl v,
fnd_executables me,
fnd_security_groups s,
fnd_application mea,
fnd_concurrent_request_class c,
fnd_application ca,
fnd_executables e,
fnd_application ea,
fnd_application a
where ((:CONCURRENT_PROGRAM_NAME is null) or
((:CONCURRENT_PROGRAM_NAME is not null) and
(v.CONCURRENT_PROGRAM_NAME like :CONCURRENT_PROGRAM_NAME)))
and ((:APPLICATION_SHORT_NAME is null) or
((:APPLICATION_SHORT_NAME is not null) and
(a.APPLICATION_SHORT_NAME like :APPLICATION_SHORT_NAME)))
......
"
UPLOAD PROGRAM
BEGIN
"begin
if (:UPLOAD_MODE = 'NLS') then
fnd_concurrent_programs_pkg.TRANSLATE_ROW (
:CONCURRENT_PROGRAM_NAME,
:APPLICATION_SHORT_NAME,
:OWNER,
:USER_CONCURRENT_PROGRAM_NAME,
:DESCRIPTION,
:CUSTOM_MODE,
:LAST_UPDATE_DATE);
else
fnd_concurrent_programs_pkg.LOAD_ROW (
:CONCURRENT_PROGRAM_NAME,
:APPLICATION_SHORT_NAME,
:OWNER,
:USER_CONCURRENT_PROGRAM_NAME,
:EXEC_EXECUTABLE_NAME,
:EXEC_APPLICATION_SHORT_NAME,
......
);
end if;
end;" |
控制文件由4部分组成:
1. 实体(entity):说明控制文件是用来移植什么的,如上面的是 PROGRAM,一个控制文件中可以有多个实体,实体可以实现嵌套,实体和后面的section对应,一般一个实体对应一个数据库表
2. 段(section):定义实体的数据结构,定义了移植时数据的结构和类型,但不会包含内部的ID,如使用APPLICATION_SHOURT_NAME代替APPLICATION_ID,一般和实体对应的数据库表的定义一致,如例子中的EXECUTABLE和PROGRAM段,运行FNDLOAD命令时需要指定段名
3. 下载(download):定义了下载数据时所使用的SQL语句,SQL语句中以冒号(:)打头的变量是FNDLOAD的变量,在运行命令时可传入参数的值来显示数据的提取,如:APPLICATION_SHORT_NAME既是限制并发请求所属的应用
上载(upload):定义了上载数据时所执行的SQL语句或者PLSQL代码,如fnd_concurrent_programs_pkg.TRANSLATE_ROW和fnd_concurrent_programs_pkg.LOAD_ROW方法
FNDLOAD命令工具的语法
FNDLOAD apps/appspwd 0 Y mode configfile datafile entity [ param ... ]
1. Mode:有 DOWNLOAD和UPLOAD
2. Configfile:就是FNDLOAD用来控制上传和下载的控制文件(lct)
3. Datafile:是生成的数据文件
4. Entity:是要多控制文件中的哪部分数据移植(数据可以嵌套,如并发请求包括了引用的值集)
5. Param:是用来控制数据移植的参数,可以多个
下面是FNDLOAD的流程描述图
二、FNDLOAD使用步骤
使用FNDLOAD来移植数据的步骤如下:
1. 找到控制文件,这是非常关键的一步,很多网上文章介绍使用FNDLOAD来移植AOL模块的数据,很少提到其它内容,实际上FNDLOAD可以用来移植数据库中的任何数据,只是说如果Oracle没有提供控制文件(lct)的话,需要自己来制作控制文件会得不偿失,而随着FNDLOAD的广泛应用,很多模块的都提供了FNDLOAD的功能,控制文件一般都放在各模块下的patch/115/import/目录下,如AOL模块的在$FND_TOP/patch/115/import下,总帐模块$GL_TOP/patch/115/import下;进入控制文件目录后具体某个控制文件是用来进行什么数据的移植那就只能打开文件看里面的实体部分、DOWNLOAD和UPLOAD部分了
2. 查看DOWNLOAD部分中SQL语句的参数,通过查看SQL语句得出可以使用哪些参数来限制数据的下载,如afcpprog.lct控制文件中并发程序的限制可以通过APPLICATION_SHORT_NAME来限制,这样就可以限制只下载某个应用下的并发,同时可以使用多个参数,参数通过key=value的方式提供,参数之间用空格隔开
3. 运行FNDLOAD命令的下载模式从源系统下载数据,如下载并发请求:FNDLOAD apps/apps 0 Y DOWNLOAD afcpprog.lct prog.ldt PROGRAM APPLICATION_SHORT_NAME=XHU CONCURRENT_PROGRAM_NAME=XHUPOR00
4. 使用ftp工具下载源系统生成的数据文件(ldt)
5. 使用ftp工具上传数据文件(ldt)到目标系统
6. 运行FNDLOAD上载模式将数据从数据文件上载到目标数据库中,如上传上面下载的并发请求: FNDLOAD apps/apps 0 Y UPLOAD afcpprog.lct prog.ldt –
三、如何移植多语言定义数据
AOL模块中很多数据的定义都是多语言的,如并发请求的定义,而通过FNDLOAD来进行数据的移植一次只包括一个语言的信息,因此如果定义存在多语言的情况,需要按照语言环境进行多次移植,即生成多个数据文件(ldt),在控制文件的目录下,如$FND_TOP/patch/115/import/下存在US和ZHS这样的语言目录,控制文件内容的开始指定了语言环境, 如LANGUAGE = “US”,而很多控制文件并未分多语言版本,这个需要在运行FNDLOAD命令的时候指定语言环境,所以使用控制文件的时候无需使用指定语言的版本,只要在运行FNDLOAD命令的时候通过下面的命令来切换语言环境
1 2 3 4 5 6 7 | --中文 NLS_LANG= "AMERICAN_AMERICA.AL32UTF8" export NLS_LANG --英文 NLS_LANG= "SIMPLIFIED CHINESE_CHINA.AL32UTF8" export NLS_LANG |
通过上面的环境设置后再执行FNDLOAD,生成的数据文件就是相应语言环境的定义,只要切换不同的语言环境执行下载,多次生成数据文件就实现了多语言数据的生成;然后执行多次上载操作即可.
NLS_LANG可以通过下面的SQL查询获得:
1 2 3 4 | SELECT '"' || nls_language || '_' || nls_territory || '.' || VALUE || '"' nls_lang FROM fnd_languages, v$nls_parameters WHERE language_code IN ('US', 'ZHS') AND parameter = 'NLS_CHARACTERSET'; |
四、开发员常用FNDLOAD控制文件列表
|
模块 |
文件名 |
描述 |
|
FND |
afcpprog.lct |
可执行、并发程序、值集、弹性域 |
|
FND |
afcpexec.lct |
可执行程序 |
|
FND |
afattach.lct |
附件 |
|
FND |
afcpreqg.lct |
请求组 |
|
FND |
afcprset.lct |
请求集 |
|
FND |
afffload.lct |
值集、关键性弹性域和描述性弹性域及相关安全性设置 |
|
FND |
aflvmlu.lct |
Lookups |
|
FND |
afmdmsg.lct |
消息 |
|
FND |
afscprof.lct |
profile options 预制文件 |
|
FND |
afscursp.lct |
Application users,User Responsibilities,Security groups,Applications,Application Responsibilities and Exclusion Functions |
|
FND |
afsload.lct |
FORM, FUNCTION, MENU, ENTRY, OBJECT, OBJECT_INSTANCE_SET, GRANT |
| FND | affrmcus.lct | Form个性化定义 |
更多控制文件请到各模块的patch/115/import目录下去查找。
相关文章:
Matthew said on 十月 10, 2010
我从R12.1.2做移植至R12.1.3,没有报错,可是没有成功。
请问会不会是版本原因呢?
admin said on 十月 10, 2010
请查看日志信息,里面会有原因。
Matthew said on 十月 26, 2010
OK了,多谢!原来是我给参数加了引号!看了一些例子才发觉是不用引号的。
Matthew said on 十月 26, 2010
Lookup code不能 随并发一起移植。
Ken said on 一月 5, 2010
谢谢分享!精华!!
demibo said on 十月 29, 2009
解析的很透彻,现在深刻的理解了它的原理!呵呵。。。
pjf said on 十月 8, 2009
前几天用过,但对fndload命令后面的参数不是很清楚,现在清楚多了,谢谢张老大
aronezhang said on 九月 28, 2009
村长是在做空调的广告吗?
闪闪 said on 九月 28, 2009
新飞空调做的好,使用一下就知道,相当的爽啊!真高级
aronezhang said on 九月 28, 2009
ls说的正是问题的所在,正因为很多环境开发人员没有操作权限,而如何dba按照设置文档进行操作有费事容易出错,因此开发人员开发测试完成后就导出数据文件,然后交给dba,让她们在正式环境中操作,这样减少了出错的可能性,同时省时省力。
Vivi said on 九月 28, 2009
非常好的原理说明。。。
赞
blank.xie said on 九月 27, 2009
挺好的,不过我们这里的一般开发人员没有prod环节的ftp权限,所以生成的数据文件无法ftp到正式环境,也就谈不上fndload啦
demibo said on 九月 27, 2009
之前了解过,现在看了,好深刻和完整啊!强。。。
老枪 said on 九月 27, 2009
哦~~~史上最完整的中文版FNDLOAD原理试用说明诞生了~~~
闪闪 said on 九月 27, 2009
看不懂啊,,,,