精华内容
下载资源
问答
  • ODI数据同步时丢失很多数据但是没报错,也执行完了 ,这个一般是什么情况,求大神指导
  • 通过odi工具,实现planning主数据同步;主要涉及到删除维度成员采用的方法。
  • 本文主要介绍通过ODI接口,将关系库主数据同步到Planning主数据。 工具:ODI 11.1.1.7;EPM 11.1.2.4;Oracle DB 11.2.0.1.0; 1.新建Planning数据服务器   服务器:IP:11333(Planning的IP) 用户:admin...

    文档下载地址:

    http://download.csdn.net/download/ye1142262478/9948449



    本文主要介绍通过ODI接口,将关系库主数据同步到Planning主数据。

    工具:ODI 11.1.1.7;EPM 11.1.2.4;Oracle DB 11.2.0.1.0;

    1.新建Planning数据服务器

     

    服务器:IP:11333(Planning的IP)

    用户:admin(Planning的用户名)

    口令:********

    (不同输入jdbc驱动,同时也无法进行测试连接。)

    2.新建物理方案

     

    应用程序:guoky1(是planning应用名,需要手工输入

    逻辑方案:Planning(手工输入的同时自动新建了逻辑方案)。

    3.新建Planning模型并反向

     

    技术:Hyperion Planning

    逻辑方案:Planning(新建物理方案时,同时建的。)

    知识模块:RKM Hyperion Planning.项目名

    点击“逆向工程”进行反向:

    查看反向记录:

    查看反向结果:

    4.新建接口

    关系库数据准备:

    执行接口。测试。成功。

    附:主数据增删改的实现

    对主数据的操作由字段“Operation”来实现:

    此字段的各值含义如下(默认null等同于Update):

    Update – Adds,updates, or moves the member being loaded (常规增改

    Delete Level 0 –Deletes the member being loaded if it has no children (没有后代的话,删除此成员

    Delete Idescendants– Deletes the member being loaded and all of its descendants (删除此成员及其后代

    Delete Descendants– Deletes the descendants of the member being loaded, but does not delete themember itself (删除后代,不删除此成员

    展开全文
  • 背景最近在项目上开始使用ODI,需求是要将一个库中的表同步到另一个库中这里可以使用ODI Studio的CDC方式进行同步数据,但CDC方式需要在表上建trigger,会对表的性能造成影响,所以该方案被否掉了,基于...

    背景

    最近在项目上开始使用ODI,需求是要将一个库中的表同步到另一个库中

    这里可以使用ODI Studio的CDC方式进行同步数据,但CDC方式需要在表上建trigger,会对表的性能造成影响,所以该方案被否掉了,基于lastupdatedate的CDC同步虽然可以部分避免性能损失问题,但这种方式需要表中的lastupdatedate对任何数据更新都有相应变化,对于一些老系统难以实现,使用IKM SQL Incremental Update又没有删除操作,不能满足需求,所以方案确定为修改现有的知识模块,使其满足需求。

    表对表增量同步

    主要思路

    在增量同步中加入删除操作,只要向 I$_表中插入目标表在工作表(C$_表)中不存在的数据,并记录标识符为D,在向目标表更新和插入数据后将标识符为D的数据删除即可(可以直接根据目标表在工作表(C$_表)中不存在的数据主键删除目标表数据,但拆成两步方便理解)

    临时表

    功能

    E$_

    临时错误表

    C$_

    临时加载表

    I$_

    临时集成表

    流程图

    st=>start: 执行接口,开始同步

    op_s=>operation: 读取源表数据

    op_c=>operation: 向$C_表插入源表数据

    op_i=>operation: $C_和目标表比对,向$I_表插入在目标表中不存在的数据,状态标志位为I

    op_e=>operation: 向$E_表插入出错的数据

    op_delete_i=>operation: 根据主键和SESSION删除$I_表在$E_表中存在的数据

    op_set_update=>operation: 根据主键设置$I_表状态标志位为U

    op_set_delete=>operation: 根据主键设置$I_表状态标志位为D

    op_update_row=>operation: 目标表更新$I_表标志位为U的行

    op_insert_row=>operation: 目标表插入$I_表标志位为I的行

    op_delete_row=>operation: 目标表删除$I_表标志位为D的行

    e=>end: 接口执行结束

    st->op_s->op_c->op_i->op_e->op_delete_i->op_set_delete->op_set_update->op_update_row->op_insert_row->op_delete_row->e

    视图对表增量同步

    主要思路

    视图对表增量同步的主要思路和表对表同步一样,只不过源表变成了源视图,需要在反向数据后设置字段长度,在增量同步中加入删除操作,只要向 I$_表中插入目标表在工作表(C$_表)中不存在的数据,并记录标识符为D,在向目标表更新和插入数据后将标识符为D的数据删除即可(可以直接根据目标表在工作表(C$_表)中不存在的数据主键删除目标表数据,但拆成两步方便理解)

    临时表

    功能

    E$_

    临时错误表

    C$_

    临时加载表

    I$_

    临时集成表

    流程图

    st=>start: 执行接口,开始同步

    op_s=>operation: 读取源视图数据

    op_c=>operation: 向$C_表插入源视图数据

    op_i=>operation: $C_和目标表比对,向$I_表插入在目标表中不存在的数据,状态标志位为I

    op_e=>operation: 向$E_表插入出错的数据

    op_delete_i=>operation: 根据主键和SESSION删除$I_表在$E_表中存在的数据

    op_set_update=>operation: 根据主键设置$I_表状态标志位为U

    op_set_delete=>operation: 根据主键设置$I_表状态标志位为D

    op_update_row=>operation: 目标表更新$I_表标志位为U的行

    op_insert_row=>operation: 目标表插入$I_表标志位为I的行

    op_delete_row=>operation: 目标表删除$I_表标志位为D的行

    e=>end: 接口执行结束

    st->op_s->op_c->op_i->op_e->op_delete_i->op_set_delete->op_set_update->op_update_row->op_insert_row->op_delete_row->e

    设置视图反向后的字段长度

    在具体执行中只需要将视图的字段长度改为合适长度

    bVbyQfV?w=1426&h=504

    实现方法

    在标记标识符为U之前,向I$_表中插入需要删除的数据

    Insert deleted rows

    /* DETECTION_STRATEGY = NOT_EXISTS */

    insert into (

    , IND_UPDATE )

    select ,

    'D'

    from T2

    where NOT EXISTS

    ( select 'X' from

    where ( ) )

    从目标表删除I$_表中标识符为D的数据

    Synchronize deletions

    delete from

    where exists (

    select 'X'

    from I

    where

    and IND_UPDATE = 'D'

    )

    加完后重新测试接口,确认接口是否生效

    原有的增量同步接口

    要解决问题,就要知道之前的增量同步方案无法有什么问题

    如下是一个增量同步的Mapping

    bVbyQfY?w=610&h=366

    目标表集成类型为增量同步

    bVbyQgm?w=532&h=222

    加载知识模块为LKM SQL to Oracle

    bVbyQgF?w=546&h=330

    集成知识模块IKM Oracle Incremental Update

    bVbyQgG?w=554&h=260

    源表

    bVbyQgI?w=800&h=220

    目标表

    bVbyQgJ?w=800&h=345

    将源表的数据修改

    bVbyQgK?w=800&h=214

    运行接口

    可以看到,接口运行完成后,修改的数据正常同步,但删除的数据没有起作用,有些接口为了处理这种情况,就在运行时先将目标表数据全部删除掉,再插入数据

    bVbyQgL?w=800&h=229

    将DELETE ALL设置为true可以在接口插入数据前将数据全部删除

    bVbyQgO?w=650&h=492

    接口运行流程图

    o_st=>start: 执行接口,开始同步

    o_op_s=>operation: 读取源表数据

    o_op_c=>operation: 向$C_表插入源表数据

    o_op_i=>operation: $C_和目标表比对,向$I_表插入在目标表中不存在的数据,状态标志位为I

    o_op_e=>operation: 向$E_表插入出错的数据

    o_op_delete_i=>operation: 根据主键和SESSION删除$I_表在$E_表中存在的数据

    o_op_set_update=>operation: 根据主键设置$I_表状态标志位为U

    o_op_update_row=>operation: 目标表更新$I_表标志位为U的行

    o_op_insert_row=>operation: 目标表插入$I_表标志位为I的行

    o_e=>end: 接口执行结束

    o_st->o_op_s->o_op_c->o_op_i->o_op_e->o_op_delete_i->o_op_set_update->o_op_update_row->o_op_insert_row->o_e

    接口运行步骤详解

    运行过程如下

    bVbyQgT?w=1871&h=899

    1.Drop work table

    接口同步数据时会在目标端数据库创建工作表,以C$_0开头,这条命令在知识模块中配置了忽略错误,所以出错也不会造成接口错误

    drop table TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE purge

    2.Create work table

    创建工作表,工作表字段基于源表

    create table TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE

    (

    ID NUMBER NULL,

    HOST VARCHAR2(200) NULL,

    POST VARCHAR2(200) NULL,

    JMS_SERVICE_NAME VARCHAR2(200) NULL,

    JMS_NAME VARCHAR2(200) NULL,

    JMS_SERVICE_TARGET VARCHAR2(200) NULL,

    JMS_SERVICE_HEALTH VARCHAR2(200) NULL,

    MESSAGES_CURRENT_COUNT NUMBER NULL,

    MESSAGES_PENDING_COUNT NUMBER NULL,

    CONSUMERS_CURRENT_COUNT NUMBER NULL,

    CONSUMERS_HIGH_COUNT NUMBER NULL,

    CONSUMERS_TOTAL_COUNT NUMBER NULL,

    MESSAGES_HIGH_COUNT NUMBER NULL,

    MESSAGES_RECEIVED_COUNT NUMBER NULL,

    OBJECT_VERSION_NUMBER NUMBER NULL,

    CREATION_DATE DATE NULL,

    CREATED_BY VARCHAR2(200) NULL,

    LAST_UPDATE_DATE DATE NULL,

    LAST_UPDATED_BY VARCHAR2(200) NULL,

    DATA_STATUS VARCHAR2(200) NULL

    )

    NOLOGGING

    3.Load data

    读取源表的数据,并插入到工作表中

    target code

    insert into TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE

    (

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS

    )

    values

    (

    :ID,

    :HOST,

    :POST,

    :JMS_SERVICE_NAME,

    :JMS_NAME,

    :JMS_SERVICE_TARGET,

    :JMS_SERVICE_HEALTH,

    :MESSAGES_CURRENT_COUNT,

    :MESSAGES_PENDING_COUNT,

    :CONSUMERS_CURRENT_COUNT,

    :CONSUMERS_HIGH_COUNT,

    :CONSUMERS_TOTAL_COUNT,

    :MESSAGES_HIGH_COUNT,

    :MESSAGES_RECEIVED_COUNT,

    :OBJECT_VERSION_NUMBER,

    :CREATION_DATE,

    :CREATED_BY,

    :LAST_UPDATE_DATE,

    :LAST_UPDATED_BY,

    :DATA_STATUS

    )

    source code

    select

    ODI_WLS_JMS_INC_SOURCE.ID AS ID,

    ODI_WLS_JMS_INC_SOURCE.HOST AS HOST,

    ODI_WLS_JMS_INC_SOURCE.POST AS POST,

    ODI_WLS_JMS_INC_SOURCE.JMS_SERVICE_NAME AS JMS_SERVICE_NAME,

    ODI_WLS_JMS_INC_SOURCE.JMS_NAME AS JMS_NAME,

    ODI_WLS_JMS_INC_SOURCE.JMS_SERVICE_TARGET AS JMS_SERVICE_TARGET,

    ODI_WLS_JMS_INC_SOURCE.JMS_SERVICE_HEALTH AS JMS_SERVICE_HEALTH,

    ODI_WLS_JMS_INC_SOURCE.MESSAGES_CURRENT_COUNT AS MESSAGES_CURRENT_COUNT,

    ODI_WLS_JMS_INC_SOURCE.MESSAGES_PENDING_COUNT AS MESSAGES_PENDING_COUNT,

    ODI_WLS_JMS_INC_SOURCE.CONSUMERS_CURRENT_COUNT AS CONSUMERS_CURRENT_COUNT,

    ODI_WLS_JMS_INC_SOURCE.CONSUMERS_HIGH_COUNT AS CONSUMERS_HIGH_COUNT,

    ODI_WLS_JMS_INC_SOURCE.CONSUMERS_TOTAL_COUNT AS CONSUMERS_TOTAL_COUNT,

    ODI_WLS_JMS_INC_SOURCE.MESSAGES_HIGH_COUNT AS MESSAGES_HIGH_COUNT,

    ODI_WLS_JMS_INC_SOURCE.MESSAGES_RECEIVED_COUNT AS MESSAGES_RECEIVED_COUNT,

    ODI_WLS_JMS_INC_SOURCE.OBJECT_VERSION_NUMBER AS OBJECT_VERSION_NUMBER,

    ODI_WLS_JMS_INC_SOURCE.CREATION_DATE AS CREATION_DATE,

    ODI_WLS_JMS_INC_SOURCE.CREATED_BY AS CREATED_BY,

    ODI_WLS_JMS_INC_SOURCE.LAST_UPDATE_DATE AS LAST_UPDATE_DATE,

    ODI_WLS_JMS_INC_SOURCE.LAST_UPDATED_BY AS LAST_UPDATED_BY,

    ODI_WLS_JMS_INC_SOURCE.DATA_STATUS AS DATA_STATUS

    from ODI.ODI_WLS_JMS_INC_SOURCE ODI_WLS_JMS_INC_SOURCE

    where (1=1)

    4.Analyze work table

    记录操作日志

    BEGIN

    DBMS_STATS.GATHER_TABLE_STATS (

    ownname => 'TESTUSER',

    tabname => 'C$_0ODI_WLS_JMS_INC_SOURCE',

    estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE

    );

    END;

    5.Drop flow table

    删除数据插入表,数据插入表是另一张同步中间表,以I$_开头,每次接口执行时执行删除操作,避免上次运行后没有删除造成问题,由于配置了忽略错误,所以出错也不会造成接口问题

    drop table TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    6.Create flow table I$

    创建数据插入表

    create table TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    (

    ID NUMBER NULL,

    HOST VARCHAR2(200) NULL,

    POST VARCHAR2(200) NULL,

    JMS_SERVICE_NAME VARCHAR2(200) NULL,

    JMS_NAME VARCHAR2(200) NULL,

    JMS_SERVICE_TARGET VARCHAR2(200) NULL,

    JMS_SERVICE_HEALTH VARCHAR2(200) NULL,

    MESSAGES_CURRENT_COUNT NUMBER NULL,

    MESSAGES_PENDING_COUNT NUMBER NULL,

    CONSUMERS_CURRENT_COUNT NUMBER NULL,

    CONSUMERS_HIGH_COUNT NUMBER NULL,

    CONSUMERS_TOTAL_COUNT NUMBER NULL,

    MESSAGES_HIGH_COUNT NUMBER NULL,

    MESSAGES_RECEIVED_COUNT NUMBER NULL,

    OBJECT_VERSION_NUMBER NUMBER NULL,

    CREATION_DATE DATE NULL,

    CREATED_BY VARCHAR2(200) NULL,

    LAST_UPDATE_DATE DATE NULL,

    LAST_UPDATED_BY VARCHAR2(200) NULL,

    DATA_STATUS VARCHAR2(400) NULL,

    IND_UPDATE CHAR(1)

    )

    NOLOGGING

    7.Delete target table

    删除目标表,上面配置DELETE ALL后,执行接口会有该步骤,在数据插入前删除所有数据,如果DELETE ALL 选择否,就不会执行这条语句,结果就是接口不同步删除的数据

    delete from TESTUSER.ODI_WLS_JMS_INC_TARGET

    8.Insert flow into I$ table

    向I$_表中插入数据,使用NOT EXIST将目标表中已存在的数据过滤掉,向I$_表中插入所有不匹配的数据,标识符都为I

    /* DETECTION_STRATEGY = NOT_EXISTS */

    insert into TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    (

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS,

    IND_UPDATE

    )

    select

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS,

    IND_UPDATE

    from (

    select

    ODI_WLS_JMS_INC_SOURCE_A.ID AS ID,

    ODI_WLS_JMS_INC_SOURCE_A.HOST AS HOST,

    ODI_WLS_JMS_INC_SOURCE_A.POST AS POST,

    ODI_WLS_JMS_INC_SOURCE_A.JMS_SERVICE_NAME AS JMS_SERVICE_NAME,

    ODI_WLS_JMS_INC_SOURCE_A.JMS_NAME AS JMS_NAME,

    ODI_WLS_JMS_INC_SOURCE_A.JMS_SERVICE_TARGET AS JMS_SERVICE_TARGET,

    ODI_WLS_JMS_INC_SOURCE_A.JMS_SERVICE_HEALTH AS JMS_SERVICE_HEALTH,

    ODI_WLS_JMS_INC_SOURCE_A.MESSAGES_CURRENT_COUNT AS MESSAGES_CURRENT_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.MESSAGES_PENDING_COUNT AS MESSAGES_PENDING_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.CONSUMERS_CURRENT_COUNT AS CONSUMERS_CURRENT_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.CONSUMERS_HIGH_COUNT AS CONSUMERS_HIGH_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.CONSUMERS_TOTAL_COUNT AS CONSUMERS_TOTAL_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.MESSAGES_HIGH_COUNT AS MESSAGES_HIGH_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.MESSAGES_RECEIVED_COUNT AS MESSAGES_RECEIVED_COUNT,

    ODI_WLS_JMS_INC_SOURCE_A.OBJECT_VERSION_NUMBER AS OBJECT_VERSION_NUMBER,

    ODI_WLS_JMS_INC_SOURCE_A.CREATION_DATE AS CREATION_DATE,

    ODI_WLS_JMS_INC_SOURCE_A.CREATED_BY AS CREATED_BY,

    ODI_WLS_JMS_INC_SOURCE_A.LAST_UPDATE_DATE AS LAST_UPDATE_DATE,

    ODI_WLS_JMS_INC_SOURCE_A.LAST_UPDATED_BY AS LAST_UPDATED_BY,

    ODI_WLS_JMS_INC_SOURCE_A.DATA_STATUS AS DATA_STATUS,

    'I' IND_UPDATE

    from TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE ODI_WLS_JMS_INC_SOURCE_A

    where (1=1)

    ) S

    where NOT EXISTS

    ( select 1 from TESTUSER.ODI_WLS_JMS_INC_TARGET T

    where T.ID = S.ID

    and T.HOST = S.HOST

    and ((T.POST = S.POST) or (T.POST IS NULL and S.POST IS NULL)) and

    ((T.JMS_SERVICE_NAME = S.JMS_SERVICE_NAME) or (T.JMS_SERVICE_NAME IS NULL and S.JMS_SERVICE_NAME IS NULL)) and

    ((T.JMS_NAME = S.JMS_NAME) or (T.JMS_NAME IS NULL and S.JMS_NAME IS NULL)) and

    ((T.JMS_SERVICE_TARGET = S.JMS_SERVICE_TARGET) or (T.JMS_SERVICE_TARGET IS NULL and S.JMS_SERVICE_TARGET IS NULL)) and

    ((T.JMS_SERVICE_HEALTH = S.JMS_SERVICE_HEALTH) or (T.JMS_SERVICE_HEALTH IS NULL and S.JMS_SERVICE_HEALTH IS NULL)) and

    ((T.MESSAGES_CURRENT_COUNT = S.MESSAGES_CURRENT_COUNT) or (T.MESSAGES_CURRENT_COUNT IS NULL and S.MESSAGES_CURRENT_COUNT IS NULL)) and

    ((T.MESSAGES_PENDING_COUNT = S.MESSAGES_PENDING_COUNT) or (T.MESSAGES_PENDING_COUNT IS NULL and S.MESSAGES_PENDING_COUNT IS NULL)) and

    ((T.CONSUMERS_CURRENT_COUNT = S.CONSUMERS_CURRENT_COUNT) or (T.CONSUMERS_CURRENT_COUNT IS NULL and S.CONSUMERS_CURRENT_COUNT IS NULL)) and

    ((T.CONSUMERS_HIGH_COUNT = S.CONSUMERS_HIGH_COUNT) or (T.CONSUMERS_HIGH_COUNT IS NULL and S.CONSUMERS_HIGH_COUNT IS NULL)) and

    ((T.CONSUMERS_TOTAL_COUNT = S.CONSUMERS_TOTAL_COUNT) or (T.CONSUMERS_TOTAL_COUNT IS NULL and S.CONSUMERS_TOTAL_COUNT IS NULL)) and

    ((T.MESSAGES_HIGH_COUNT = S.MESSAGES_HIGH_COUNT) or (T.MESSAGES_HIGH_COUNT IS NULL and S.MESSAGES_HIGH_COUNT IS NULL)) and

    ((T.MESSAGES_RECEIVED_COUNT = S.MESSAGES_RECEIVED_COUNT) or (T.MESSAGES_RECEIVED_COUNT IS NULL and S.MESSAGES_RECEIVED_COUNT IS NULL)) and

    ((T.OBJECT_VERSION_NUMBER = S.OBJECT_VERSION_NUMBER) or (T.OBJECT_VERSION_NUMBER IS NULL and S.OBJECT_VERSION_NUMBER IS NULL)) and

    ((T.CREATION_DATE = S.CREATION_DATE) or (T.CREATION_DATE IS NULL and S.CREATION_DATE IS NULL)) and

    ((T.CREATED_BY = S.CREATED_BY) or (T.CREATED_BY IS NULL and S.CREATED_BY IS NULL)) and

    ((T.LAST_UPDATE_DATE = S.LAST_UPDATE_DATE) or (T.LAST_UPDATE_DATE IS NULL and S.LAST_UPDATE_DATE IS NULL)) and

    ((T.LAST_UPDATED_BY = S.LAST_UPDATED_BY) or (T.LAST_UPDATED_BY IS NULL and S.LAST_UPDATED_BY IS NULL)) and

    ((T.DATA_STATUS = S.DATA_STATUS) or (T.DATA_STATUS IS NULL and S.DATA_STATUS IS NULL))

    )

    9.Create Index on flow table

    为I$_表创建索引

    create index TESTUSER.I$_ODI_WLS_JMS_INC_TARGET_UK

    on TESTUSER.I$_ODI_WLS_JMS_INC_TARGET (ID, HOST)

    NOLOGGING

    10.Analyze integration table

    记录日志

    begin

    dbms_stats.gather_table_stats(

    ownname => 'TESTUSER',

    tabname => 'I$_ODI_WLS_JMS_INC_TARGET',

    estimate_percent => dbms_stats.auto_sample_size

    );

    end;

    11.create check table

    创建校验表,用来存放插入失败的数据

    create table TESTUSER.SNP_CHECK_TAB

    (

    CATALOG_NAME VARCHAR2(100 CHAR) NULL ,

    SCHEMA_NAME VARCHAR2(100 CHAR) NULL ,

    RESOURCE_NAME VARCHAR2(100 CHAR) NULL,

    FULL_RES_NAME VARCHAR2(100 CHAR) NULL,

    ERR_TYPE VARCHAR2(1 CHAR) NULL,

    ERR_MESS VARCHAR2(250 CHAR) NULL ,

    CHECK_DATE DATE NULL,

    ORIGIN VARCHAR2(250 CHAR) NULL,

    CONS_NAME VARCHAR2(128 CHAR) NULL,

    CONS_TYPE VARCHAR2(2 CHAR) NULL,

    ERR_COUNT NUMBER(10) NULL

    )

    12.delete previous check sum

    删除以前的校验数据

    delete from TESTUSER.SNP_CHECK_TAB

    where SCHEMA_NAME = 'TESTUSER'

    and ORIGIN = '(171)mdsProject.My_increment'

    and ERR_TYPE = 'F'

    13.create error table

    创建错误表,用来记录插入错误的数据

    create table TESTUSER.E$_ODI_WLS_JMS_INC_TARGET

    (

    ODI_ROW_ID UROWID,

    ODI_ERR_TYPE VARCHAR2(1 CHAR) NULL,

    ODI_ERR_MESS VARCHAR2(250 CHAR) NULL,

    ODI_CHECK_DATE DATE NULL,

    ID NUMBER NULL,

    HOST VARCHAR2(200) NULL,

    POST VARCHAR2(200) NULL,

    JMS_SERVICE_NAME VARCHAR2(200) NULL,

    JMS_NAME VARCHAR2(200) NULL,

    JMS_SERVICE_TARGET VARCHAR2(200) NULL,

    JMS_SERVICE_HEALTH VARCHAR2(200) NULL,

    MESSAGES_CURRENT_COUNT NUMBER NULL,

    MESSAGES_PENDING_COUNT NUMBER NULL,

    CONSUMERS_CURRENT_COUNT NUMBER NULL,

    CONSUMERS_HIGH_COUNT NUMBER NULL,

    CONSUMERS_TOTAL_COUNT NUMBER NULL,

    MESSAGES_HIGH_COUNT NUMBER NULL,

    MESSAGES_RECEIVED_COUNT NUMBER NULL,

    OBJECT_VERSION_NUMBER NUMBER NULL,

    CREATION_DATE DATE NULL,

    CREATED_BY VARCHAR2(200) NULL,

    LAST_UPDATE_DATE DATE NULL,

    LAST_UPDATED_BY VARCHAR2(200) NULL,

    DATA_STATUS VARCHAR2(400) NULL,

    ODI_ORIGIN VARCHAR2(250 CHAR) NULL,

    ODI_CONS_NAME VARCHAR2(128 CHAR) NULL,

    ODI_CONS_TYPE VARCHAR2(2 CHAR) NULL,

    ODI_PK VARCHAR2(32 CHAR) PRIMARY KEY,

    ODI_SESS_NO VARCHAR2(36 CHAR)

    )

    14.delete previous errors

    删除错误表之前数据

    delete from TESTUSER.E$_ODI_WLS_JMS_INC_TARGET

    where (ODI_ERR_TYPE = 'S' and 'F' = 'S')

    or (ODI_ERR_TYPE = 'F' and ODI_ORIGIN = '(171)mdsProject.My_increment')

    15.Create index on PK

    为I$_表创建索引

    /* FLOW CONTROL CREATE THE INDEX ON I$TABLE */

    create index TESTUSER.I$_ODI_WLS_JMS_INC_TARGET_PK

    on TESTUSER.I$_ODI_WLS_JMS_INC_TARGET (ID, HOST)

    16.insert PK errors

    插入主键不唯一的行

    insert into TESTUSER.E$_ODI_WLS_JMS_INC_TARGET

    (

    ODI_PK,

    ODI_SESS_NO,

    ODI_ROW_ID,

    ODI_ERR_TYPE,

    ODI_ERR_MESS,

    ODI_ORIGIN,

    ODI_CHECK_DATE,

    ODI_CONS_NAME,

    ODI_CONS_TYPE,

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS

    )

    select SYS_GUID(),

    'abb01f39-16b9-41ba-9820-7733e137f237',

    rowid,

    'F',

    'ODI-15064: 主键 ODI_WLS_JMS_INC_TARGET_PK 不是唯一的。',

    '(171)mdsProject.My_increment',

    sysdate,

    'ODI_WLS_JMS_INC_TARGET_PK',

    'PK',

    ODI_WLS_JMS_INC_TARGET.ID,

    ODI_WLS_JMS_INC_TARGET.HOST,

    ODI_WLS_JMS_INC_TARGET.POST,

    ODI_WLS_JMS_INC_TARGET.JMS_SERVICE_NAME,

    ODI_WLS_JMS_INC_TARGET.JMS_NAME,

    ODI_WLS_JMS_INC_TARGET.JMS_SERVICE_TARGET,

    ODI_WLS_JMS_INC_TARGET.JMS_SERVICE_HEALTH,

    ODI_WLS_JMS_INC_TARGET.MESSAGES_CURRENT_COUNT,

    ODI_WLS_JMS_INC_TARGET.MESSAGES_PENDING_COUNT,

    ODI_WLS_JMS_INC_TARGET.CONSUMERS_CURRENT_COUNT,

    ODI_WLS_JMS_INC_TARGET.CONSUMERS_HIGH_COUNT,

    ODI_WLS_JMS_INC_TARGET.CONSUMERS_TOTAL_COUNT,

    ODI_WLS_JMS_INC_TARGET.MESSAGES_HIGH_COUNT,

    ODI_WLS_JMS_INC_TARGET.MESSAGES_RECEIVED_COUNT,

    ODI_WLS_JMS_INC_TARGET.OBJECT_VERSION_NUMBER,

    ODI_WLS_JMS_INC_TARGET.CREATION_DATE,

    ODI_WLS_JMS_INC_TARGET.CREATED_BY,

    ODI_WLS_JMS_INC_TARGET.LAST_UPDATE_DATE,

    ODI_WLS_JMS_INC_TARGET.LAST_UPDATED_BY,

    ODI_WLS_JMS_INC_TARGET.DATA_STATUS

    from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET ODI_WLS_JMS_INC_TARGET

    where exists (

    select SUB.ID,

    SUB.HOST

    from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET SUB

    where SUB.ID=ODI_WLS_JMS_INC_TARGET.ID

    and SUB.HOST=ODI_WLS_JMS_INC_TARGET.HOST

    group by SUB.ID,

    SUB.HOST

    having count(1) > 1

    )

    17.insert Not Null errors

    插入主键为空的行,如果是多个主键,该步骤执行多次,每次一个主键字段

    insert into TESTUSER.E$_ODI_WLS_JMS_INC_TARGET

    (

    ODI_PK,

    ODI_SESS_NO,

    ODI_ROW_ID,

    ODI_ERR_TYPE,

    ODI_ERR_MESS,

    ODI_CHECK_DATE,

    ODI_ORIGIN,

    ODI_CONS_NAME,

    ODI_CONS_TYPE,

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS

    )

    select

    SYS_GUID(),

    'abb01f39-16b9-41ba-9820-7733e137f237',

    rowid,

    'F',

    'ODI-15066: 列ID不能为空值。',

    sysdate,

    '(171)mdsProject.My_increment',

    'ID',

    'NN',

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS

    from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    where ID is null

    18.create index on error table

    为E$_表创建索引

    /* FLOW CONTROL CREATE INDEX ON THE E$TABLE */

    create index TESTUSER.E$_ODI_WLS_JMS_INC_TARGET_IDX

    on TESTUSER.E$_ODI_WLS_JMS_INC_TARGET (ODI_ROW_ID)

    19.delete errors from controlled table

    从I$_表中删除错误的行

    delete from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET T

    where exists (

    select 1

    from TESTUSER.E$_ODI_WLS_JMS_INC_TARGET E

    where ODI_SESS_NO = 'abb01f39-16b9-41ba-9820-7733e137f237'

    and T.rowid = E.ODI_ROW_ID

    )

    20.insert check sum into check table

    向TESTUSER.SNP_CHECK_TAB中记录错误数据

    insert into TESTUSER.SNP_CHECK_TAB

    (

    SCHEMA_NAME,

    RESOURCE_NAME,

    FULL_RES_NAME,

    ERR_TYPE,

    ERR_MESS,

    CHECK_DATE,

    ORIGIN,

    CONS_NAME,

    CONS_TYPE,

    ERR_COUNT

    )

    select

    'TESTUSER',

    'ODI_WLS_JMS_INC_TARGET',

    'TESTUSER.ODI_WLS_JMS_INC_TARGET',

    E.ODI_ERR_TYPE,

    E.ODI_ERR_MESS,

    E.ODI_CHECK_DATE,

    E.ODI_ORIGIN,

    E.ODI_CONS_NAME,

    E.ODI_CONS_TYPE,

    count(1)

    from TESTUSER.E$_ODI_WLS_JMS_INC_TARGET E

    where E.ODI_ERR_TYPE = 'F'

    and E.ODI_ORIGIN = '(171)mdsProject.My_increment'

    group by E.ODI_ERR_TYPE,

    E.ODI_ERR_MESS,

    E.ODI_CHECK_DATE,

    E.ODI_ORIGIN,

    E.ODI_CONS_NAME,

    E.ODI_CONS_TYPE

    21.Flag rows for update

    设置I$_主键在目标表中存在的行IND_UPDATE 为U,表示这些行需要更新,为I表示需要插入

    /* DETECTION_STRATEGY = NOT_EXISTS */

    update TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    set IND_UPDATE = 'U'

    where (ID, HOST)

    in (

    select ID,

    HOST

    from TESTUSER.ODI_WLS_JMS_INC_TARGET

    )

    22.Update existing rows

    更新已存在的行

    /* DETECTION_STRATEGY = NOT_EXISTS */

    update TESTUSER.ODI_WLS_JMS_INC_TARGET T

    set (

    T.POST,

    T.JMS_SERVICE_NAME,

    T.JMS_NAME,

    T.JMS_SERVICE_TARGET,

    T.JMS_SERVICE_HEALTH,

    T.MESSAGES_CURRENT_COUNT,

    T.MESSAGES_PENDING_COUNT,

    T.CONSUMERS_CURRENT_COUNT,

    T.CONSUMERS_HIGH_COUNT,

    T.CONSUMERS_TOTAL_COUNT,

    T.MESSAGES_HIGH_COUNT,

    T.MESSAGES_RECEIVED_COUNT,

    T.OBJECT_VERSION_NUMBER,

    T.CREATION_DATE,

    T.CREATED_BY,

    T.LAST_UPDATE_DATE,

    T.LAST_UPDATED_BY,

    T.DATA_STATUS

    ) =

    (

    select S.POST,

    S.JMS_SERVICE_NAME,

    S.JMS_NAME,

    S.JMS_SERVICE_TARGET,

    S.JMS_SERVICE_HEALTH,

    S.MESSAGES_CURRENT_COUNT,

    S.MESSAGES_PENDING_COUNT,

    S.CONSUMERS_CURRENT_COUNT,

    S.CONSUMERS_HIGH_COUNT,

    S.CONSUMERS_TOTAL_COUNT,

    S.MESSAGES_HIGH_COUNT,

    S.MESSAGES_RECEIVED_COUNT,

    S.OBJECT_VERSION_NUMBER,

    S.CREATION_DATE,

    S.CREATED_BY,

    S.LAST_UPDATE_DATE,

    S.LAST_UPDATED_BY,

    S.DATA_STATUS

    from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET S

    where T.ID =S.ID

    and T.HOST =S.HOST

    )

    where (ID, HOST)

    in (

    select ID,

    HOST

    from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    where IND_UPDATE = 'U'

    )

    23.Insert new rows

    插入新的行

    /* DETECTION_STRATEGY = NOT_EXISTS */

    insert into TESTUSER.ODI_WLS_JMS_INC_TARGET T

    (

    ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS

    )

    select ID,

    HOST,

    POST,

    JMS_SERVICE_NAME,

    JMS_NAME,

    JMS_SERVICE_TARGET,

    JMS_SERVICE_HEALTH,

    MESSAGES_CURRENT_COUNT,

    MESSAGES_PENDING_COUNT,

    CONSUMERS_CURRENT_COUNT,

    CONSUMERS_HIGH_COUNT,

    CONSUMERS_TOTAL_COUNT,

    MESSAGES_HIGH_COUNT,

    MESSAGES_RECEIVED_COUNT,

    OBJECT_VERSION_NUMBER,

    CREATION_DATE,

    CREATED_BY,

    LAST_UPDATE_DATE,

    LAST_UPDATED_BY,

    DATA_STATUS

    from TESTUSER.I$_ODI_WLS_JMS_INC_TARGET S

    where IND_UPDATE = 'I'

    24.Drop work table

    删除工作表

    drop table TESTUSER.C$_0ODI_WLS_JMS_INC_SOURCE purge

    25.Drop flow table

    删除I$_表

    drop table TESTUSER.I$_ODI_WLS_JMS_INC_TARGET

    26.一次增量同步完成

    展开全文
  • ODI系列:XML File数据同步问题

    千次阅读 2012-03-05 16:54:14
    ODI为XML数据同步提供了便利,可通过ODI将XML文件数据同步到其他的数据存储中。详细设置操作可见ODI的官方文档。 目前在实现XML数据同步到Oracle数据库的时候,遇到问题:当XML文件数据发生改变时,第一次执行,...

    ODI为XML数据同步提供了便利,可通过ODI将XML文件数据同步到其他的数据存储中。详细设置操作可见ODI的官方文档。

    目前在实现XML数据同步到Oracle数据库的时候,遇到问题:当XML文件数据发生改变时,第一次执行,通常没能获取到实时的数据,即变更后的数据,在ODI同步时,不起作用。

    以同步contry.xml为例子:

    1、contry.xml文件结构如下

    2、XML数据服务器的设置如下:

    3、将contry.xml反向后,用ODI查看数据时如下:

    4、将contry.xml文件中的loc变成SiChuan后,在ODI模型处查看xml存储,发现数据跟步骤3的一样,即ODI并没有及时将最新的数据反应到模型,跟ODI中对表存储的效果不一样;在接口中第一次执行时,若xml数据发生变更,也会出现此类情况;由此可能导致数据丢失遗漏;

    Solution:

    经过查阅资料,可通过XML数据服务器的JDBC中追加参数解决。

    在JDBC的URL后面,添加上参数dod=yes,即可保证xml文件的数据实时同步。

    解决的思路是:

    利用了dod参数的原理,dod=yes,可将内存、驱动中的schema清理,上一次的缓存JDBC关闭时,自动会释放,保证了每次读取的数据都是实时最新的,若为大数据量的同步,会导致性能减弱。按照查阅到的资料,dod参数需放到整个url的最末端。I donot know why^^,测试下来,dod放在哪里目前都没影响数据。

    相关资料如下:

    https://forums.oracle.com/forums/thread.jspa?threadID=638547

    http://docs.oracle.com/cd/E15985_01/doc.10136/user/e16274/xml/doc/driver_configuration.htm

     http://docs.oracle.com/cd/E17904_01/integrate.1111/e12644/appendix_xml_driver.htm#CHDICHDB

     

     

    展开全文
  • 通过ODI工具 实现CDC实时同步数据
  • 1、反向模型日志记录选择->简单,知识模块如下图: 2、添加CDC 3、订阅订户: ...选中模型中的TB_TEST,右击---->"已更改数据捕获"----->...5、新建包使能实时同步 添加OdiSleep ...

    1、反向模型日志记录选择->简单,知识模块如下图:

    2、添加CDC

    3、订阅订户:

    选中模型中的TB_TEST,右击---->"已更改数据捕获"----->订户----->订阅;

    4、启动日志:

    选中模型中的TB_TEST,右击---->"已更改数据捕获"----->启动日志;

    5、新建包使能实时同步

     添加OdiSleep

    添加OdiWaitForLogData

    将上一章新建的映射添加到视图中,结果如下:

    6、修改参数,如图:

    sleep等待时间1秒钟,这里单位为毫秒

     

     

     

    如此配置完成,点击运行这个程序包,则基本实现实时同步,这里可以看到延时在1秒钟,但是已经能够满足业务需要了

    展开全文
  • ODI利用CDC实现实时同步数据

    千次阅读 2015-04-28 14:23:58
    table_02作为目标表,需要实时的与源数据表table_01同步(即table_01更新或者是插入或者是删除了一行记录,table_02能够实时的同步此操作----此处设置为延时10s同步------已经很了不得了 好伐!!!~~) 工具: ODI ...
  • ODI数据抽取教程_01设置数据源

    千次阅读 2016-09-23 17:14:11
    第一步:设置抽取的数据源和目标数据源1、 首先要有两个数据库,一个是提供源数据的数据库,可以是ODI的支持的任意类型,sqlserver、oracle、mysql、hive均可以,此处以Orale为例,目标数据库也为Oracle,后续将写...
  • WebService调用ODI同步任务

    千次阅读 2014-01-08 20:37:02
    ODI11G默认提供了WebService的调用接口,供其他各种应用程序通过接口控制、访问ODI自身的同步任务。 ODI11G在安装完成,启动代理后,会自动启动webservice的服务端口,对外提供WSDL文件服务,外部应用可以通过WSDL...
  • ODI数据抽取教程_03定时执行

    千次阅读 2016-09-27 14:45:12
    多数情况下,我们需要ODI根据时间设置自动执行任务,以解脱人力。本章节将介绍如何设置ODI的自动执行任务。在进行本章节之前,需要做好以下前提工作: 1、 已设置ODI代理并测试成功。 2、 已设置至少一个ODI的映射...
  • java 调用 odi webservice

    2013-08-05 20:59:26
    用户需要通过第三方手动调用触发ODI方案的执行从而实现数据的同步。文档中描述了如何创建及调用ODI webservice,包括测试结果,相信对想手动调用实现odi数据同步者会有帮助。
  • ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(一) 【ODI】| 数据ETL:从零开始使用Oracle ODI完成数据集成(二) 8. 创建项目及接口 项目包含了开发人员所开发的所有对象,项目包含的元素有接口、...
  • ODI中删除数据的处理

    2016-05-19 13:18:00
    ODI中删除数据的处理 一、前提知识:数据从源数据库向数据仓库抽取时,一般采用以下几种方式: 全抽取模式如果表的数据量较小,则可以采取全表抽取方式,以TRUNCATE/INSERT方式进行数据抽取。 基于时间戳...
  • 由于在ODI的操作中会帮我们设置数据库的参数(如java_pool、streams_pool_size)这里只需要设置补充和强制记录模式,实际在操作流程中ODI会帮我们设置特定表的日志模式,不过为了保险还有对更多表的操作有效,还是...
  • ODI首先迁移ERP系统未同步至WMS的满足同步条件的退货订单信息,并更新单据头的弹性域的ATTRIBUTE12为P,通过ODI Interface,进入WMS客制化接口表,更新ERP单据头的弹性域的ATTRIBUTE12为I,随后对WMS客制化接口表...
  • sql server 进行数据odi

    2018-01-11 13:37:57
    sql server 有没有类似oracle 的Oracle Data Integrator 的功能。...我有oracle的数据,想抽取到sql server2017 服务器上,历史数据存在本地sql server数据库,有更新才从oracle同步过来。大致想这样实现一下。
  • CDC不同模式在ODI中体现系列之一 同步模式 Oracle Database Change Data Capture feature 变化数据捕获是一个通称,是用来描述捕捉增量变化应用到数据存储。随着数据量的不断增长和数据存储日益变化,数据捕获...
  • 最近做的几个项目,都碰到了ODI从oracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库的抽取,提供了3类知识模块:Oracle SimpleOracle ConsistentOracle 9i/10g...
  • 使用ODI 12c与Oracle Hyperion Planning进行数据集成 尽管当前的Oracle Data Integrator 12c(ODI 12c)版本不包括Oracle Hyperion Planning知识模块,Oracle Hyperion Planning随附的Outline Load Utility可...
  • ODI同步遇到问题  ORA-00932: 数据类型不一致: 应为 -, 但却获得 CLOB 将代码中union 修改成 union all,同步完成。 转载于:https://www.cnblogs.com/lingbaozhangqian/p/4095373.html...
  • 最近做的几个项目,都碰到了ODI从oracle9i或者10g数据库中抽取增量数据的情况,那么ODI如何从数据库中抽取增量数据呢,ODI针对Oracle数据库的抽取,提供了3类知识模块: Oracle Simple Oracle Consistent ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 538
精华内容 215
关键字:

odi数据同步