标签:
以食品REPORTS表为例,说明ODI在LIMS系统中的配置与使用。
先为REPORTS表添加列LIMS_CODE
注意:类型为NUMBER(*,0),不允许为空,默认值为4(中心为1、可靠性为2、环境为3、食品为4);
说明:
ODI的增量刷新要求源表与目标表都有主键,并且同步根据主键来刷新其他字段,这就要求主键值永久不变。在LIMS系统中,主键值是会变的,比如ORDTASK中的,就有修改测试方法的功能,如果主键发生了变化,则后续的刷新就无法完成。为了使LIMS能够正常同步,引入了ORIGRE + LIMS_CODE组合,以确保在系统中唯一,同时也保证值永久不会变化。
再添加唯一索引
在模型ODI_SRC_FDD(为每套系统建立起一套模型)中,添加REPORTS的元数据信息(配置模型等过程省略)
如下图,打开ODI_SRC_FDD模型
选择右边的取消全选
选择REPORTS,再选择“Reverse Engineer”
选择“Yes”
逆向工程完成后,ODI_SRC_FDD模型中就有了ORDTASK的信息,如图
接下来,需要配置同步信息了。为了简化配置操作,封装了函数CTI_FDD_DATA.FN_ODI,并且创建了公共同义词
如上图,第一个参数为模式名,USER为当前模式名,REPORTS为表名,函数返回信息如下:
INSERT INTO SNP_SUBSCRIBERS(JRN_TNAME,JRN_SUBSCRIBER,JRN_REFDATE,JRN_ROW_COUNT,JRN_DATA_CMD,JRN_COUNT_CMD)
VALUES (‘CTI_FDD_DATA.REPORTS‘,‘REPORTS‘,SYSDATE,0,NULL,‘update CTI_FDD_DATA.SNP_SUBSCRIBERS SUBS set SUBS.JRN_ROW_COUNT=(select count(‘‘X‘‘) from CTI_FDD_DATA.J$REPORTS JRN where JRN.JRN_SUBSCRIBER=‘‘$$SUBSCRIBER_NAME$$‘‘) where SUBS.JRN_SUBSCRIBER=‘‘$$SUBSCRIBER_NAME$$‘‘ and SUBS.JRN_TNAME = ‘‘CTI_FDD_DATA.REPORTS‘‘‘);
commit;
CREATE TABLE J$REPORTS(jrn_subscriber VARCHAR2(400 CHAR) not null,
jrn_consumed VARCHAR2(1 CHAR),
jrn_flag VARCHAR2(1 CHAR),
jrn_date DATE,
ORIGREC NUMBER(*,0),
LIMS_CODE NUMBER(*,0));
create or replace trigger T$REPORTS
after insert or update or delete on CTI_FDD_DATA.REPORTS
for each row
declare
V_FLAG VARCHAR(1);
V_ORIGREC NUMBER;
V_LIMS_CODE NUMBER;
begin
if inserting then
V_ORIGREC := :new.ORIGREC;
V_LIMS_CODE := :new.LIMS_CODE;
V_FLAG := ‘I‘;
end if;
if updating then
V_ORIGREC := :new.ORIGREC;
V_LIMS_CODE := :new.LIMS_CODE;
V_FLAG := ‘I‘;
end if;
if deleting then
V_ORIGREC := :old.ORIGREC;
V_LIMS_CODE := :old.LIMS_CODE;
V_FLAG := ‘D‘;
end if;
insert into CTI_FDD_DATA.J$REPORTS
(JRN_SUBSCRIBER,
JRN_CONSUMED,
JRN_FLAG,
JRN_DATE,
ORIGREC,
LIMS_CODE)
select JRN_SUBSCRIBER,
‘0‘,
V_FLAG,
sysdate,
V_ORIGREC,
V_LIMS_CODE
from CTI_FDD_DATA.SNP_SUBSCRIBERS
where JRN_TNAME = ‘CTI_FDD_DATA.REPORTS‘;
end;
create or replace view jv$dREPORTS as
select decode(TARG.ROWID, null, ‘D‘, ‘I‘) AS JRN_FLAG,
JRN.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
JRN.JRN_DATE AS JRN_DATE,
JRN.ORIGREC AS ORIGREC,
JRN.LIMS_CODE AS LIMS_CODE, TARG.ORIGSTS,TARG.FOLDERNO,TARG.REPORTNO,TARG.REPORTTYPE,TARG.REPORTCAT,TARG.REPORTGENTYPE,TARG.STATUS,TARG.DISPSTS,TARG.ASSESS,TARG.ASSESS_ENG,TARG.REMARK,TARG.ADDEDBY,TARG.ADDEDDATE,TARG.TESTBY,TARG.TESTBYFULLNAME,TARG.TESTDATE,TARG.APPROVEDBY,TARG.APPROVEDDATE,TARG.RELEASEDBY,TARG.RELEASEDDATE,TARG.PATH,TARG.PATH_PDF,TARG.PATH_WATERMARK,TARG.DIVISIONCODE,TARG.DEPT,TARG.DEPTNAME,TARG.ORDNOS,TARG.REFUSEFLAG,TARG.EDIT_TIMES,TARG.SENDEXPRESSNO,TARG.NEEDSIGN,TARG.HASSIGNED,TARG.ALLOWEDIT,TARG.HASSIGNED_W
from (select L.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
L.ORIGREC AS ORIGREC,
L.LIMS_CODE AS LIMS_CODE,
max(L.JRN_DATE) AS JRN_DATE
from CTI_FDD_DATA.J$REPORTS L
group by L.JRN_SUBSCRIBER, L.ORIGREC,L.LIMS_CODE) JRN,
CTI_FDD_DATA.REPORTS TARG
where JRN.ORIGREC = TARG.ORIGREC(+)
and JRN.LIMS_CODE = TARG.LIMS_CODE(+);
create or replace view jv$REPORTS as
select decode(TARG.ROWID, null, ‘D‘, ‘I‘) AS JRN_FLAG,
JRN.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
JRN.JRN_DATE AS JRN_DATE,
JRN.ORIGREC AS ORIGREC,
JRN.LIMS_CODE AS LIMS_CODE,TARG.ORIGSTS,TARG.FOLDERNO,TARG.REPORTNO,TARG.REPORTTYPE,TARG.REPORTCAT,TARG.REPORTGENTYPE,TARG.STATUS,TARG.DISPSTS,TARG.ASSESS,TARG.ASSESS_ENG,TARG.REMARK,TARG.ADDEDBY,TARG.ADDEDDATE,TARG.TESTBY,TARG.TESTBYFULLNAME,TARG.TESTDATE,TARG.APPROVEDBY,TARG.APPROVEDDATE,TARG.RELEASEDBY,TARG.RELEASEDDATE,TARG.PATH,TARG.PATH_PDF,TARG.PATH_WATERMARK,TARG.DIVISIONCODE,TARG.DEPT,TARG.DEPTNAME,TARG.ORDNOS,TARG.REFUSEFLAG,TARG.EDIT_TIMES,TARG.SENDEXPRESSNO,TARG.NEEDSIGN,TARG.HASSIGNED,TARG.ALLOWEDIT,TARG.HASSIGNED_W
from (
select L.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
L.ORIGREC AS ORIGREC,
L.LIMS_CODE AS LIMS_CODE,
max(L.JRN_DATE) AS JRN_DATE
from CTI_FDD_DATA.J$REPORTS L
where L.JRN_CONSUMED =‘1‘
group by L.JRN_SUBSCRIBER,
L.ORIGREC,L.LIMS_CODE
) JRN,
CTI_FDD_DATA.REPORTS TARG
where JRN.ORIGREC = TARG.ORIGREC(+)
and JRN.LIMS_CODE = TARG.LIMS_CODE(+);
执行完上面语句后,同步的基本信息已经配置完成。接下来,需要将表添加到CDC,再配置映射关系。
如图,选择“Add to CDC”
发现,为表REPORT添加了绿色小时钟。
新建映射
如图,将ODI_SRC_FDD下面的REPORTS表、ODI_TAG_DC下面的REPORTS表拖动到窗口中
从源表拉动到目标表,建立字段映射关系,如下图
点击工具栏上的勾,进行映射验证(主要验证类型及字段长度)
验证成功
修改订阅用户(由于我们的基础信息由自定义函数生成,订阅用户默认与表名相同)
选择“增量更新”
选择仅记录的日志
选择加载知识模型
选择集成知识模型
REPORTS_FDD映射已经配置完成
选择“Run”,验证执行情况
从执行日志上面看,配置是没有问题的。接下来,进行数据方面的测试
如图,向源表插入了一条记录,然后执行同步
查询目标表,数据已经刷新
修改数据(主键REPORTNO + 其他字段REPORTTYPE)并提交,执行同步
数据已经刷新
删除数据提交,并执行同步
数据已刷新。
附FN_ODI函数
CREATE OR REPLACE FUNCTION FN_ODI(v_SCHEMA VARCHAR2, v_TABLENAME VARCHAR2)
RETURN CLOB AUTHID CURRENT_USER IS
m_out CLOB;
m_cols CLOB;
m_cnt INTEGER;
BEGIN
m_out := ‘‘;
--创建订阅用户
SELECT COUNT(*)
INTO m_cnt
FROM SNP_SUBSCRIBERS
WHERE JRN_TNAME = v_SCHEMA || ‘.‘ || v_TABLENAME;
IF m_cnt = 0 THEN
m_out := ‘INSERT INTO SNP_SUBSCRIBERS(JRN_TNAME,JRN_SUBSCRIBER,JRN_REFDATE,JRN_ROW_COUNT,JRN_DATA_CMD,JRN_COUNT_CMD)
VALUES (‘‘‘ || v_SCHEMA || ‘.‘ || v_TABLENAME ||
‘‘‘,‘‘‘ || v_TABLENAME || ‘‘‘,SYSDATE,0,NULL,‘‘update ‘ ||
v_SCHEMA ||
‘.SNP_SUBSCRIBERS SUBS set SUBS.JRN_ROW_COUNT=(select count(‘‘‘‘X‘‘‘‘) from ‘ ||
v_SCHEMA || ‘.J$‘ || v_TABLENAME ||
‘ JRN where JRN.JRN_SUBSCRIBER=‘‘‘‘$$SUBSCRIBER_NAME$$‘‘‘‘) where SUBS.JRN_SUBSCRIBER=‘‘‘‘$$SUBSCRIBER_NAME$$‘‘‘‘ and SUBS.JRN_TNAME = ‘‘‘‘‘ ||
v_SCHEMA || ‘.‘ || v_TABLENAME || ‘‘‘‘‘‘‘);‘;
m_out := m_out || chr(10);
m_out := m_out || ‘commit;‘;
m_out := m_out || chr(10) || chr(10);
END IF;
-- 创建日志表
m_out := m_out || ‘CREATE TABLE J$‘ || v_TABLENAME ||
‘(jrn_subscriber VARCHAR2(400 CHAR) not null,
jrn_consumed VARCHAR2(1 CHAR),
jrn_flag VARCHAR2(1 CHAR),
jrn_date DATE,
ORIGREC NUMBER(*,0),
LIMS_CODE NUMBER(*,0));‘;
--创建触发器
m_out := m_out || chr(10) || chr(10);
m_out := m_out || ‘create or replace trigger T$‘ || v_TABLENAME || ‘
after insert or update or delete on ‘ || v_SCHEMA || ‘.‘ ||
v_TABLENAME || ‘
for each row
declare
V_FLAG VARCHAR(1);
V_ORIGREC NUMBER;
V_LIMS_CODE NUMBER;
begin
if inserting then
V_ORIGREC := :new.ORIGREC;
V_LIMS_CODE := :new.LIMS_CODE;
V_FLAG := ‘‘I‘‘;
end if;
if updating then
V_ORIGREC := :new.ORIGREC;
V_LIMS_CODE := :new.LIMS_CODE;
V_FLAG := ‘‘I‘‘;
end if;
if deleting then
V_ORIGREC := :old.ORIGREC;
V_LIMS_CODE := :old.LIMS_CODE;
V_FLAG := ‘‘D‘‘;
end if;
insert into ‘ || v_SCHEMA || ‘.J$‘ || v_TABLENAME || ‘
(JRN_SUBSCRIBER,
JRN_CONSUMED,
JRN_FLAG,
JRN_DATE,
ORIGREC,
LIMS_CODE)
select JRN_SUBSCRIBER,
‘‘0‘‘,
V_FLAG,
sysdate,
V_ORIGREC,
V_LIMS_CODE
from ‘ || v_SCHEMA || ‘.SNP_SUBSCRIBERS
where JRN_TNAME = ‘‘‘ || v_SCHEMA || ‘.‘ || v_TABLENAME || ‘‘‘;
end;‘;
--获取列信息
SELECT WM_CONCAT(‘TARG.‘ || COLUMN_NAME)
INTO m_cols
FROM (SELECT COLUMN_NAME
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = v_TABLENAME
AND COLUMN_NAME NOT IN (‘ORIGREC‘, ‘LIMS_CODE‘)
ORDER BY COLUMN_ID);
--创建视图
m_out := m_out || chr(10) || chr(10);
m_out := m_out || ‘create or replace view jv$d‘ || v_TABLENAME || ‘ as
select decode(TARG.ROWID, null, ‘‘D‘‘, ‘‘I‘‘) AS JRN_FLAG,
JRN.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
JRN.JRN_DATE AS JRN_DATE,
JRN.ORIGREC AS ORIGREC,
JRN.LIMS_CODE AS LIMS_CODE, ‘ || m_cols || ‘
from (select L.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
L.ORIGREC AS ORIGREC,
L.LIMS_CODE AS LIMS_CODE,
max(L.JRN_DATE) AS JRN_DATE
from ‘ || v_SCHEMA || ‘.J$‘ || v_TABLENAME || ‘ L
group by L.JRN_SUBSCRIBER, L.ORIGREC,L.LIMS_CODE) JRN,
‘ || v_SCHEMA || ‘.‘ || v_TABLENAME ||
‘ TARG
where JRN.ORIGREC = TARG.ORIGREC(+)
and JRN.LIMS_CODE = TARG.LIMS_CODE(+);‘;
m_out := m_out || chr(10) || chr(10);
m_out := m_out || ‘create or replace view jv$‘ || v_TABLENAME || ‘ as
select decode(TARG.ROWID, null, ‘‘D‘‘, ‘‘I‘‘) AS JRN_FLAG,
JRN.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
JRN.JRN_DATE AS JRN_DATE,
JRN.ORIGREC AS ORIGREC,
JRN.LIMS_CODE AS LIMS_CODE,‘ || m_cols || ‘
from (
select L.JRN_SUBSCRIBER AS JRN_SUBSCRIBER,
L.ORIGREC AS ORIGREC,
L.LIMS_CODE AS LIMS_CODE,
max(L.JRN_DATE) AS JRN_DATE
from ‘ || v_SCHEMA || ‘.J$‘ || v_TABLENAME || ‘ L
where L.JRN_CONSUMED =‘‘1‘‘
group by L.JRN_SUBSCRIBER,
L.ORIGREC,L.LIMS_CODE
) JRN,
‘ || v_SCHEMA || ‘.‘ || v_TABLENAME ||
‘ TARG
where JRN.ORIGREC = TARG.ORIGREC(+)
and JRN.LIMS_CODE = TARG.LIMS_CODE(+);‘;
RETURN m_out;
END;
标签:
原文地址:http://www.cnblogs.com/wangcm/p/5871196.html