EBS开发之环境迁移

(一)环境迁移说明

1.1   迁移

由于EBS系统开发复杂,一般项目实施都是使用三套或者三套以上的系统,一套作为开发使用系统,一套作为集成测试系统,一套就是企业用的正式环境系统,在项目实施过程中对一些开发所创建的表,同义词,索引,值集,快速编码,并发程序等等内容我们需要从开发环境拷贝到测试环境上去,当测试完成后我们又要拷贝到正式环境上去,这一拷贝过程就叫做迁移。在开发过程中需要拷贝的东西量都比较大,所以迁移不是简单的拷贝

1.2  迁移步骤

1.EBS应用的安装

2.ORACLE用户的创建

3.ORACLE数据库对象创建

4.ORACLE应用对象的创建

1.3   迁移的方法

迁移就是实现客户化对象从一个地方到另一个地方,所以肯定先是从一个地方取出来,然后放到另一个地方上去,具体的来说就是采用各种方法将一个系统的对象下载下来形成一个文件然后上传到新的服务器上去,然后写人新的环境

1.      利用FNDLOAD实现对象的DOWNLOADUPLOAD

2.      利用dbms_lob包将对象写成大对象,然后加载上去

3.      使用EXPDPIMPDP迁移数据

 

2.1   oracle产品结构

 

2.2 创建表空间
CREATE [TEMPORARY] 
TABLESPACE [tablespace name] 
DATAFILE/TEMPFILE[file] 
DEFAULTSTORAGE ([storage parameters])
[option];
TEMPORARY: 临时表空间,一般与TEMPFILE搭配

Alter database datafile ‘F:\app\Rainbow\oradata\orcl\ school_01.dbf’ resize 30m;


 

表空间信息

属于临时表空间的临时文件信息 DBA_TEMP_FILES

属于表空间的数据文件的信息 DBA_DATA_FILES

所有临时文件的信息 V$TEMPFILE

所有数据文件的信息 V$DATAFILE

所有(用户能访问的)表空间内自由区域的信息 DBA_FREE_SPACE

USER_FREE_SPACE

所有(用户能访问的)表空间内数据区域的信息 DBA_EXTENTS

USER_EXTENTS

所有(用户能访问的)表空间内的数据段的信息 DBA_SEGMENTS

USER_SEGMENTS

所有(用户能访问的)表空间的描述 DBA_TABLESPACE

USER_TABLESPACE

所有表空间的名称及相关信息 V$TABLESPACE

2.3  创建用户
Create user 用户名 identified by 密码
2 default tablespace 表空间名
3 temporary tablespace temp;


 

2.4 DBMS_LOB
1、dbms_lob.append(
	dest_lob IN OUT NOCOPY BLOB,
	src_lob IN BLOB)
  dbms_lob.append(
               dest_lob IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,
               src_lob  IN CLOB CHRACTER SET dest_lob%CHARSET);
 将源LOB变量的内容添加到目标LOB变量的尾部。
 示例:dest_lob clob;
       src_lob clob;
       dbms_lob.append(dest_lob,src_lob);

	2、dbms_lob.close(lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE)
关闭已经打开的LOB。

	3、dbms_lob.compare(
	lob_1 IN BLOB/CLOB/BFILE,
	lob_2 IN BLOB/CLOB/BFILE,
	amount IN INTEGER:=4294967295,--要比较的字符数(CLOB),字节数(BLOB)
	offset_1 IN INTEGER:=1,--lob_1的起始位置
	offset_2 IN INTEGER:=1--lob_2的起始位置)
  比较两个LOB的内容。

	4、dbms_lob.copy(
	dest_lob IN OUT NOCOPY BLOB/CLOB/NCLOB,
	src_lob IN BLOB/CLOB/NCOB,
	amount IN INTEGER,
	dest_offset IN INTEGER:=1,
	src_offset IN INTEGER:=1)
	  从src_lob中,以src_offset为起始位置,截取amount个字符/字节,放到dest_lob的dest_offset位置。
	5、dbms_lob.createtemporary(
	lob_loc IN OUT NOCOPY BLOB/DLOB/NCLOB,
	cache IN BOOLEAN,
	dur IN PLS_INTEGER:=10)
  在用户的临时表空间中,建立临时LOB。
  lob_loc:指定LOB定位符。
  Cache:是否将LOB读取到缓冲区。
  Dur:指定何时清除临时LOB(10:会话结束时。12:调用结束时)。

	6、dbms_lob.erase(
	lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,
	amount IN OUT NOCOPY INTEGER,--字符/字节数
	offset IN INTEGER:=1—起始位置
	)
  删除LOB变量的内容。

	7、dbms_lob.fileclose(file_loc IN OUT NOCOPY BFILE)
关闭打开的BFILE定位符所指向的OS文件

	8、dbms_lob.filecloseall关闭当前会话已经打开的所有BFILE文件。

	9、dbms_lob.fileexists(file_loc IN BFILE) RETURN INTEGER
确定file_loc对应的OS文件是否存在,1:存在。0:不存在。

10、dbms_lob.filegetname(
	file_loc IN BFILE,
	dir_alias OUT varchar2,
	filename OUT varchar2)
获取BFILE定位符所对应的目录别名和文件名。

11、dbms_lob.fileisopen(file_loc IN BFILE) RETURN INTEGER
	确定BFILE对应的OS文件是否打开。

12、dbms_lob.freetemporary(lob_lob IN OUT NOCOPY BLOB/CLOB/NCLOB)
	释放在默认临时表空间中的临时LOB。

13、dbms_lob.fileopen(file_loc IN OUT NOCOPY BFILE,
	Open_mode IN BINARY_INTEGER:file_readonly)
	打开文件。

14、dbms_lob.getchunksize(lob_loc IN BLOB/CLOB/NCLOB) RETURN INTEGER
当建立包含CLOB/BLOB列的表时,通过指定CHUNK参数可以指定操纵LOB需要分配的字节数(数据库尺寸的整数倍)默认为数据块的尺寸。

15、dbms_lob.getlength(lob_loc IN BLOB/CLOB/BFILE/NCLOB) RETURN INTEGER
	获取长度。

16、dbms_lob.instr(
	Lob_loc IN BLOB/CLOB/NCLOB/BFILE,
	Pattern IN RAW/VARCHAR2,
	Offset IN INTERGER:=1,
	Nth  IN INTEGER:=1) RETURN INTEGER;
  返回特定样式数据从LOB某偏移位置开始出现N次的具体位置。
17、dbms_lob.idopen(lob_loc IN BLOB/CLOB/BFILE) RETURN INT
	确定LOB是否打开,打开:1,未打开:0。

18、dbms_lob.istemporary(lob_loc IN BLOB/CLOB/NCLOB) RETURN INTEGER
	确定定位符是否为临时LOB。

19、dbms_lob.loadfromfile(
	dest_lob IN OUT NOCOPY BLOB/CLOB,
	src_file IN FILE,
	amount IN INTEGER,
	dest_offset IN INTEGER:=1,
	src_offset IN INTEGER:=1)
  将BFILE的部分或全部内容复制到目标LOB变量。

20、dbms_lob.loadblobfromfile(
	dest_lob IN OUT NOCOPY BLOB,
	src_bfile IN BFILE,
	amount IN INTEGER,
	dest_offset IN OUT INTEGER,
	src_offset IN OUT INTEGER)
	将BFILE数据装载到BLOB中,并且在装载后取得最新的偏移位置。

21、dbms_lob.open(
	lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE,
	open_mode IN BINARY_INTEGER)
	打开LOB,open_mode(只读:dbms_lob.lob_readonly,读写:dbms_lob.lob_readwrite).

22、dbms_lob.read(
	lob_loc IN BLOB/CLOB/BFILE,
	amount IN OUT NOCOPY BINARY_INTEGER),--IN:要读取的字符数,      
	                                           OUT:实际读取的字符数。
	Offset IN INTEGER,
	Buffer OUT RAW/VARCHAR2—存储数据的变量
	)
	将LOB数据读取到缓存区中(变量中)。

23、dbms_lob.substr(
	Lob_loc IN BLOB/CLOB/BFILE,
	Amount IN INTEGER:=32762,
	Offset IN INTEGER:=1) RETURN RAW/VARCHAR2
	与字符处理函数SUBSTR()使用方法一样。

24、dbms_lob.trim(
	Lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,
	Newlen IN INTEGER)
	截断LOB到指定长度。

25、dbms_lob.write(
	Lob_loc IN OUT NOCOPY BLOB/CLOB,
	Amount IN BINARY_INTEGER,
	Offset IN INTEGER,
	Buffer IN RAW/VARCHAR2)
	将缓冲区数据写入到LOB中的特定位置。
26、dbms_lob.writeappend(
	Lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,
	Amount IN BINARY_INTEGER,
	Buffer IN RAW/VARCHAR2)
   将缓冲区数据写到LOB尾部。


 

2.5dbms_metadata
1.DBMS_METADATA.SET_TRANSFORM_PARAM (
   transform_handle   IN NUMBER,
   name               IN VARCHAR2,
   value              IN VARCHAR2,
   object_type        IN VARCHAR2 DEFAULT NULL);

DBMS_METADATA.SET_TRANSFORM_PARAM (
   transform_handle   IN NUMBER,
   name               IN VARCHAR2,
   value              IN BOOLEAN DEFAULT TRUE,
   object_type        IN VARCHAR2 DEFAULT NULL);

DBMS_METADATA.SET_TRANSFORM_PARAM (
   transform_handle   IN NUMBER,
   name               IN VARCHAR2,
   value              IN NUMBER,
   object_type        IN VARCHAR2 DEFAULT NULL);

DBMS_METADATA.SET_REMAP_PARAM (
   transform_handle   IN NUMBER,
   name               IN VARCHAR2,
   old_value          IN VARCHAR2,
   new_value          IN VARCHAR2,
   object_type        IN VARCHAR2 DEFAULT NULL);


 

说明:Specify parameters to the XSLT stylesheet identified bytransform_handle.Use them to modify or customize the output of the transform

 

 

Parameters

Description

transform_handle

Either (1) the handle returned fromADD_TRANSFORM, or (2)  the enumerated constantSESSION_TRANSFORM that designates the  DDL transform for the whole session.

Note that the handle returned byOPEN is not a  valid transform handle.

For SET_REMAP_PARAM, the transform  handle must designate the MODIFY transform.

name

The name of the parameter.

Table  57-22 lists the transform parameters defined for the DDL transform,  specifying the object_type it applies to, its datatype, and its  meaning or effect. This includes its default value, if any, and whether the  parameter is additive.

Table  57-23 describes the parameters for the MODIFY transform in the SET_TRANSFORM_PARAM  procedure.

Table  57-24 describes the parameters for the MODIFY transform in the SET_REMAP_PARAM  procedure.

value

The value of the transform. This parameter is valid only forSET_TRANSFORM_PARAM.

old_value

The old value for the remapping. This parameter is valid only  forSET_REMAP_PARAM.

new_value

The new value for the remapping. This parameter is valid only  forSET_REMAP_PARAM.

object_type

Designates the object type to which the transform or remap  parameter applies. By default, it applies to the same object type as the  transform. In cases where the transform applies to all object types within a  heterogeneous collection, the following apply:

  • If object_type is omitted, the       parameter applies to all applicable object types within the       heterogeneous collection.
  • If object_type is specified, the       parameter only applies to that object type.

This allows a caller who has added a transform to a  heterogeneous collection to specify different transform parameters for  different object types within the collection.

 

2.DBMS_METADATA.GET_DDL

 

说明:得到数据库的对象的ddl

  例子:得到一个用户下的所有表,索引,存储过程的ddl

SET SERVEROUTPUT ON 

SET LINESIZE 1000 

SET FEEDBACK OFF  

set long 999999

SET PAGESIZE 1000

EXECUTE  DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',false);
SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name) 

FROM USER_OBJECTS u  

where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE'); 

2.6 DBMS_LOB包
DBMS_LOB包中主要提供了以下几个过程供用户对内部LOB字段进行维护。

       APPEND():将源LOB中的内容加到目的LOB中
       COPY():从源LOB中复制数据到目的LOB
       ERASE():删除LOB中全部或部分内容
       TRIM():将LOB值减少到指定的长度
       WRITE():向LOB中写入数据
       COMPARE():比较两个同种数据类型的LOB的部分或全部值是否相同
       GETLENGTH():获取LOB的长度
       READ():从LOB中读出数据

PROCEDURE WRITE(lob_locIN OUTBLOB,
                     amount  INBINARY_INTEGER, 
                     offset  ININTEGER,
                     buffer  INRAW);
 
PROCEDURE WRITE (lob_locIN OUTCLOBCHARACTER SETANY_CS,     
                     amount  INBINARY_INTEGER,     
                     offset  ININTEGER,     
                     buffer  INVARCHAR2CHARACTER SET lob_loc%CHARSET); 
PROCEDURE READ(lob_locINBLOB,
                    amount  IN OUTBINARY_INTEGER,
                    offset  ININTEGER,
                    buffer  OUTRAW);

    PROCEDURE READ (lob_loc INCLOBCHARACTER SET ANY_CS,
                    amount  IN OUTBINARY_INTEGER,
                    offset  ININTEGER,
                    buffer  OUTVARCHAR2 CHARACTER SET lob_loc%CHARSET);
    

    各参数的含义为:

    lob_loc:要写入的LOB定位器
    amount:写入LOB中的字节数
    offset:指定开始操作的偏移量
    buffer:指定写操作的缓冲区


(三)EBS应用安装
3.1 安装步骤
传统方式:
1. 注册客户化应用
2. Unix环境下创建客户化目录结构
3. 修改环境变量配置文件
4. 注册客户化模式成为Oracle用户
5. 添加客户化模式到数据组中
6. 注册客户化应用到Alert应用
7. 在客户化模式下运行APPS_DDL和APPS_ARRAY_DDL数据库包
这种方式往往操作起来比较繁琐,并且在修改一些服务器配置的时候容易出现错误
更好的方式:
使用了Oracle提供的adsplice这个工具,将其包装到了shell脚本中
1. 上传压缩文件extapp.zip 到服务器
2. 使用unzip解压文件,并进入extapp目录
3. 使用chmod命令修改appinstall.sh文件的执行权限(chmod 777 appinstall.sh)
4. 编辑客户化应用配置文件ext.cfg
5. 运行脚本appinstall.sh

3.2编辑客户化环境信息
采用运行公司脚本实现
1. 应用的简称(必须在4个字符内)
2. 应用的名称(如果应用名称中包括了空格,需要以下划线来代替)
3. 应用所对应的数据表空间和索引表空间(表空间必须在数据库中存在)

实例:
%%% Hand Extension control file
# $Header: ext.cfg 1.0 2006/06/10 01:46:19 Arone noship $
# Section for Hand Extension Application
 
app_abbr=xxau
app_name=Arone_Extensions_Utility
main_tspace=APPS_TS_TX_DATA
index_tspace=APPS_TS_TX_IDX
 
# end of Hand Extension Application


 

3.2创建表空间APPS_TS_TOOLS

如果系统打了RUP4,需要先创建一个表空间APPS_TS_TOOLS

CREATE TABLESPACE APPS_TS_TOOLS DATAFILE
'datafile_name.dbf' SIZE 500M
EXTENT MANAGEMENT LOCAL AUTOALLOCATE;


 

SELECT *FROM dba_data_files

CREATE TABLESPACE APPS_TS_TOOLS DATAFILE

'/u05/test/testdata/a_ts_tool_data01.dbf'SIZE 500M

EXTENT MANAGEMENT LOCAL AUTOALLOCATE;

3.3运行脚本创建客户化信息

运行脚本文件 extapp/appinstall.sh来创建客户化应用环境

./appinstall.sh apps/apps

并按照提示提供必要的信息,请参考“创建客户化环境示例”一节

3.4检查客户化环境是否创建

1.  查看APPL_TOP目录下是否已创建客户化应用目录

2.  查看应用是否已经创建

3.  查看Oracle ID是否注册

4.  查看Data Group是否已经注册

 

(四)ORACLE用户创建

4.1创建用户
CREATE USER cux IDENTIFIED BY cux DEFAULT TABLESPACE APPS_TS_TX_DATA TEMPORARY TABLESPACE TEMP;

4.2 用户赋权
GRANT CONNECT,RESOURCE TO cux;

GRANT CREATE VIEW TO cux;
GRANT SELECT ANY DICTIONARY TO cux;
GRANT CREATE SYNONYM TO cux;


 

(五)ORACLE数据库创建

5.1 创建DIRECTORY
create or replace directory HAND_DIR as '/home/oratest/hand/install/';
grant read, write on directory HAND_DIR to apps;
5.2 创建临时CLOB表
create table CUX.HEB_CLOB_TEST
(
  CLOB_DOC      CLOB,
  CLOB_DESC     VARCHAR2(240),
  CREATION_DATE DATE default SYSDATE
)
tablespace APPS_TS_TX_DATA
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 128
    next 8
    minextents 1
    maxextents unlimited
    pctincrease 0
  );
5.3 应用注册
BEGIN
  fnd_mo_product_init_pkg.register_application(p_appl_short_name => 'CUX',
                                               p_owner           => 'CUX',
                                               p_status          => 'Y');
END;
5.4 使用EXPDP和IMPDP迁移数据
导出:
1.创建directory。
    create or replace directory HAND_DIR as '/home/oratest/hand/install/';
2.将DIRECTORY的读写权限授权给HEC用户
    grant read, write on directory HAND_DIR to apps;
    chmod 777 expdp
3.使用EXPDP生成DMP文件
expdp apps/apps DIRECTORY=HAND_DIR DUMPFILE=APPS_CUX.20131205.dmp schemas=apps INCLUDE=PACKAGE:\"LIKE \'CUX%\'\", VIEW:\"LIKE \'CUX%\'\"  LOGFILE=APPS_CUX20131005.dmp.log
导入:
4.创建directory。
    create or replace directory HAND_DIR as '/home/oratest/hand/install';
5.将DIRECTORY的读写权限授权给HEC用户
    grant read, write on directory HAND_DIR to apps;
    chmod 777 impdp
6.使用IMPDP导入DMP文件   
    impdp system/manager DIRECTORY=HAND_DIR DUMPFILE=APPS_CUX.20131205.dmp TABLE_EXISTS_ACTION=TRUNCATE LOGFILE=APPS_CUX.20131205.imp.log
5.5 DBMS包迁移数据
导出数据:
1.	表
PROCEDURE insert_clob(clob_doc IN CLOB, clob_desc VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
  BEGIN
    INSERT INTO cux.heb_clob_test
      (clob_doc, clob_desc)
    VALUES
      (clob_doc, clob_desc);
    COMMIT;
  
  EXCEPTION
    WHEN OTHERS THEN
      ROLLBACK;
  END insert_clob;

DECLARE
  CURSOR cur_seq IS
    SELECT do.owner schema_name, do.object_name seq_name
      FROM dba_objects do
     WHERE do.owner IN('CUX','OA','OMS')
       AND do.object_type = 'SEQUENCE';
  l_seq_ddl   VARCHAR2(32767);
  l_sequence_name  VARCHAR2(40) := NULL;
  l_seg_count   NUMBER;
  l_bod_len     NUMBER := 0;
  l_buf_len     NUMBER := 1000;
  l_buf_len_std NUMBER := 1000;
  x_clob        CLOB;

BEGIN
  dbms_lob.createtemporary(lob_loc => x_clob, cache => TRUE);
  ----输出信息采用缩排或换行格式化
/*  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'PRETTY',
                                    FALSE);*/
  --确保每个语句都带分号
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'SQLTERMINATOR',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'TABLESPACE',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'CONSTRAINTS',
                                    FALSE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'REF_CONSTRAINTS',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'STORAGE',
                                    FALSE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'CONSTRAINTS_AS_ALTER',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'SEGMENT_ATTRIBUTES',
                                    TRUE);
  FOR rec_seq IN cur_seq LOOP
    dbms_output.enable(buffer_size => 999999);
    --初始化
    l_seq_ddl   := NULL;
    l_sequence_name  := rec_seq.seq_name;
    BEGIN
    l_seq_ddl := dbms_metadata.get_ddl('SEQUENCE', l_sequence_name, rec_seq.schema_name);
    EXCEPTION WHEN OTHERS THEN 
      NULL;
    END;
        dbms_lob.writeappend(lob_loc => x_clob,
                         amount  => length(l_seq_ddl),
                         buffer  => l_seq_ddl);                                                                   
  END LOOP; --FOR IN table_name LOOP   
  cux_clob_test_pkg.insert_clob(clob_doc =>x_clob,clob_desc => 'ALL_SEQUENCE_INSTALL');
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('GET_DDL ERROR:' || SQLERRM);
END;
2.	其他(例如SEQUENCE)
DECLARE
  CURSOR cur_seq IS
    SELECT do.owner schema_name, do.object_name seq_name
      FROM dba_objects do
     WHERE do.owner IN('CUX','OA','OMS')
       AND do.object_type = 'SEQUENCE';
  l_seq_ddl   VARCHAR2(32767);
  l_sequence_name  VARCHAR2(40) := NULL;
  l_seg_count   NUMBER;
  l_bod_len     NUMBER := 0;
  l_buf_len     NUMBER := 1000;
  l_buf_len_std NUMBER := 1000;
  x_clob        CLOB;

BEGIN
  dbms_lob.createtemporary(lob_loc => x_clob, cache => TRUE);
  ----输出信息采用缩排或换行格式化
/*  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'PRETTY',
                                    FALSE);*/
  --确保每个语句都带分号
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'SQLTERMINATOR',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'TABLESPACE',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'CONSTRAINTS',
                                    FALSE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'REF_CONSTRAINTS',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'STORAGE',
                                    FALSE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'CONSTRAINTS_AS_ALTER',
                                    TRUE);
  dbms_metadata.set_transform_param(dbms_metadata.session_transform,
                                    'SEGMENT_ATTRIBUTES',
                                    TRUE);
  FOR rec_seq IN cur_seq LOOP
    dbms_output.enable(buffer_size => 999999);
    --初始化
    l_seq_ddl   := NULL;
    l_sequence_name  := rec_seq.seq_name;
    BEGIN
    l_seq_ddl := dbms_metadata.get_ddl('SEQUENCE', l_sequence_name, rec_seq.schema_name);
    EXCEPTION WHEN OTHERS THEN 
      NULL;
    END;
        dbms_lob.writeappend(lob_loc => x_clob,
                         amount  => length(l_seq_ddl),
                         buffer  => l_seq_ddl);                                                                   
  END LOOP; --FOR IN table_name LOOP   
  insert_clob(clob_doc =>x_clob,clob_desc => 'ALL_SEQUENCE_INSTALL');
EXCEPTION
  WHEN OTHERS THEN
    dbms_output.put_line('GET_DDL ERROR:' || SQLERRM);
END;


 

导入:

sqlplus上执行导出的sql文件,就可将对象写入到新环境

(六)ORACLE应用对象创建

6.1迁移步骤

1.编写获取需要迁移的对象的抽取SQL

例:

-并发程序
  CURSOR cux_cp IS
    SELECT t.concurrent_program_name, t.user_concurrent_program_name
      FROM fnd_concurrent_programs_vl t
     WHERE t.application_id =
           (SELECT tt.application_id
              FROM fnd_application_vl tt
             WHERE tt.application_short_name = 'CUX');
  --LOOKUP
  CURSOR cux_lookup IS
    SELECT t.lookup_type
      FROM cux_lookup_types t
     WHERE t.description NOT LIKE '%作废%';
  --PROFILE
  CURSOR cux_profile IS
    SELECT t.profile_option_name
      FROM fnd_profile_options_vl t
     WHERE t.profile_option_name LIKE 'HEB%';
  --值集   
  CURSOR cux_value_set IS
    SELECT t.flex_value_set_name
      FROM fnd_flex_value_sets t /*, fnd_flex_values v*/ --表验证值集没有fnd_flex_values
     WHERE (t.description LIKE 'CUX%' OR t.description LIKE 'HEB%')
       AND t.validation_type = 'F'
       AND t.flex_value_set_id NOT IN
           (SELECT b.flex_value_set_id
              FROM fnd_flex_value_sets b
             WHERE b.description LIKE '%作废%');
   --弹性域
  CURSOR cux_ddf IS
    SELECT DISTINCT b.descriptive_flexfield_name
      FROM fnd_descr_flex_contexts_tl t, fnd_descr_flex_contexts b
     WHERE b.application_id = t.application_id
       AND b.descriptive_flexfield_name = t.descriptive_flexfield_name
       AND b.descriptive_flex_context_code =
           t.descriptive_flex_context_code
       AND t.language = userenv('LANG')
       AND b.descriptive_flex_context_code LIKE '%CUX%'


 

2.编写批量生成处理信息的函数

函数的编写比较简单不做多描述,可以根据下面给出的生成脚本自己根据下面的例子编写其他程序

例:

下载值集
PROCEDURE fnd_load_value_set(p_value_set_name VARCHAR2) IS
  BEGIN
    dbms_output.put_line('FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afffload.lct ' ||
                         g_output_path || 'VALUESET_' || p_value_set_name ||
                         '.ldt VALUE_SET FLEX_VALUE_SET_NAME=''' ||
                         p_value_set_name || '''' || ';');
  END;


 

上传值集
PROCEDURE upload_value_set(p_value_set_name VARCHAR2) IS
  BEGIN
    dbms_output.put_line('FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/afffload.lct ' ||
                         'VALUESET_' || p_value_set_name || '.ldt;');
  END;


 

3.调用批量生成处理信息程序,生成相应脚本

例:

--菜单
FNDLOAD apps/apps O Y DOWNLOAD $FND_TOP/patch/115/import/afsload.lct CUX_SUPPER_USER_MENU.ldt MENU MENU_NAME="CUX_SUPPER_USER_MENU";

FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/afsload.lct CUX_SUPPER_USER_MENU.ldt;


 

--PROFILE
FNDLOAD apps/apps O Y DOWNLOAD $FND_TOP/patch/115/import/afscprof.lct CUX_PROFILE_ALL.ldt PROFILE APPLICATION_SHORT_NAME="CUX";

FNDLOAD apps/apps O Y UPLOAD $FND_TOP/patch/115/import/afscprof.lct CUX_PROFILE_ALL.ldt;


 

--消息
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afmdmsg.lct  CUX_MSG_ALL_ZHS.ldt FND_NEW_MESSAGES APPLICATION_SHORT_NAME="CUX";
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afmdmsg.lct  CUX_MSG_ALL_US.ldt FND_NEW_MESSAGES APPLICATION_SHORT_NAME="CUX";

FNDLOAD apps/apps O Y UPLOAD $FND_TOP/patch/115/import/afmdmsg.lct CUX_MSG_ALL_ZHS.ldt;
FNDLOAD apps/apps O Y UPLOAD $FND_TOP/patch/115/import/afmdmsg.lct CUX_MSG_ALL_US.ldt;


 

-form个性化
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/affrmcus.lct AP_APXINWKB.ldt FND_FORM_CUSTOM_RULES function_name=AP_APXINWKB;

FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/affrmcus.lct APXINWKB.ldt;


 

-并发程序
FNDLOAD apps/apps O Y DOWNLOAD $FND_TOP/patch/115/import/afcpprog.lct CUX_CP_ALL.ldt PROGRAM APPLICATION_SHORT_NAME="CUX";

FNDLOAD apps/apps O Y UPLOAD $FND_TOP/patch/115/import/afcpprog.lct CUX_CP_ALL.ldt;


 

-LOOKUP 
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/aflvmlu.lct CUX_LOOKUP_ALL.ldt FND_LOOKUP_TYPE APPLICATION_SHORT_NAME="CUX";

FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/aflvmlu.lct CUX_LOOKUP_ALL.ldt


 

-值集迁移
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afffload.lct CUX_P_VALUE_SET.ldt VALUE_SET FLEX_VALUE_SET_NAME="ZX_省";
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afffload.lct CUX_C_VALUE_SET.ldt VALUE_SET FLEX_VALUE_SET_NAME="ZX_市";

FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/afffload.lct CUX_P_VALUE_SET.ldt;
FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/afffload.lct CUX_C_VALUE_SET.ldt;


 

--DDF
FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afffload.lct CUX_DFF_ALL.ldt DESC_FLEX APPLICATION_SHORT_NAME="CUX";

FNDLOAD apps/apps 0 Y UPLOAD $FND_TOP/patch/115/import/afffload.lct CUX_DFF_ALL.ldt;


 

4.将生成的脚本上传到服务器上

路径在生成脚本的程序中指定,DOWNLOAD上传到旧环境服务器上,UPLOAD上传到新环境服务器上

5.下载对象

登陆旧环境的服务器LINUX下,切换到上面指定的路径下运行DOWNLOAD脚本,生成LDT文件

6.上传对象

登陆新环境服务器,将上面生成的LDT文件上传到服务器上

7.完成移植

登陆新环境服务器LINUX下,执行UPLOAD脚本,完成移植

 

 
 
6.2 DOWNLOAD举例
DECLARE
  --CP
  CURSOR cux_cp IS
    SELECT t.concurrent_program_name, t.user_concurrent_program_name
      FROM fnd_concurrent_programs_vl t
     WHERE t.application_id =
           (SELECT tt.application_id
              FROM fnd_application_vl tt
             WHERE tt.application_short_name = 'CUX');
  --LOOKUP
  CURSOR cux_lookup IS
    SELECT t.lookup_type
      FROM cux_lookup_types t
     WHERE t.description NOT LIKE '%作废%';
  --PROFILE
  CURSOR cux_profile IS
    SELECT t.profile_option_name
      FROM fnd_profile_options_vl t
     WHERE t.profile_option_name LIKE 'HEB%';
BEGIN
  dbms_output.enable(buffer_size => NULL);
  --CP
  FOR rec_cp IN cux_cp LOOP
    cux_fnd_load_utl.fnd_load_program(p_program_name    => rec_cp.concurrent_program_name,
                                      p_appl_short_name => 'CUX');
  END LOOP; --FOR cux_cp IN cux_cp LOOP
  --LOOKUP
  FOR rec_lookup IN cux_lookup LOOP
    cux_fnd_load_utl.fnd_load_lookup_code(p_lookup_code_name => rec_lookup.lookup_type);
  END LOOP; --FOR rec_lookup IN cux_lookup LOOP
  --PROFILE
  FOR rec_profile IN cux_profile LOOP
    cux_fnd_load_utl.fnd_load_profile(p_profile_name    => rec_profile.profile_option_name);
  END LOOP; --FOR cux_cp IN cux_cp LOOP  
END;
 
 
6.3  UPLOAD举例
DECLARE
  --CP
  CURSOR cux_cp IS
    SELECT t.concurrent_program_name, t.user_concurrent_program_name
      FROM fnd_concurrent_programs_vl t
     WHERE t.application_id =
           (SELECT tt.application_id
              FROM fnd_application_vl tt
             WHERE tt.application_short_name = 'CUX');
  --LOOKUP
  CURSOR cux_lookup IS
    SELECT t.lookup_type
      FROM cux_lookup_types t
     WHERE t.description NOT LIKE '%作废%';
  --PROFILE
  CURSOR cux_profile IS
    SELECT t.profile_option_name
      FROM fnd_profile_options_vl t
     WHERE t.profile_option_name LIKE 'HEB%';
BEGIN
  dbms_output.enable(buffer_size => NULL);
  --CP
  FOR rec_cp IN cux_cp LOOP
    cux_fnd_load_utl.upload_program(p_program_name    => rec_cp.concurrent_program_name);
  END LOOP; --FOR cux_cp IN cux_cp LOOP
  --LOOKUP
  FOR rec_lookup IN cux_lookup LOOP
    cux_fnd_load_utl.upload_lookup_code(p_lookup_code_name => rec_lookup.lookup_type);
  END LOOP; --FOR rec_lookup IN cux_lookup LOOP
  --PROFILE
  FOR rec_profile IN cux_profile LOOP
    cux_fnd_load_utl.upload_profile(p_profile_name    => rec_profile.profile_option_name);
  END LOOP; --FOR cux_cp IN cux_cp LOOP  
END;
6.2 FNDLOAD 服务程序
利用dbms_output程序包功能实现大对象的读取和写入
简单举例:配置文件迁移脚本输出
fnd_load_profile(p_profile_name VARCHAR2) IS
  BEGIN
    dbms_output.put_line('FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afscprof.lct ' ||
                         g_output_path || 'PROFILE_' || p_profile_name ||
                         '.ldt PROFILE PROFILE_NAME=''' || p_profile_name || '''' || ';');
  END;
简单举例:快速编码迁移
脚本输出
fnd_load_value_set(p_value_set_name VARCHAR2) IS
  BEGIN
    dbms_output.put_line('FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afffload.lct ' ||
                         g_output_path || 'VALUESET_' || p_value_set_name ||
                         '.ldt VALUE_SET FLEX_VALUE_SET_NAME=''' ||
                         p_value_set_name || '''' || ';');
  END;
简单举例:应用程序迁移
脚本输出
fnd_load_program(p_program_name    VARCHAR2,
                             p_appl_short_name IN VARCHAR2 DEFAULT 'CUX') IS
    l_appl_short_name VARCHAR2(30);
  BEGIN
    IF (p_appl_short_name IS NULL) THEN
      l_appl_short_name := 'CUX';
    ELSE
      l_appl_short_name := p_appl_short_name;
    END IF;
    dbms_output.put_line('FNDLOAD apps/apps 0 Y DOWNLOAD $FND_TOP/patch/115/import/afcpprog.lct ' ||
                         g_output_path || 'CONC_' || p_program_name ||
                         '.ldt PROGRAM APPLICATION_SHORT_NAME=''' ||
                         l_appl_short_name ||
                         ''' CONCURRENT_PROGRAM_NAME=''' || p_program_name || '''' || ';');
  END;




 

转载于:https://www.cnblogs.com/wanghang/p/6299518.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值