informatica 加工数据,数据的某些属性有变化了,保存变化历史记录。
例如客户表DW_CRM_COMM_CUSTOMER2
,当 JYYTX、SQLXX、SCLXX
三个字段有变化了 存历史记录,并标记最新记录;当CUSTOMERCODE
客户代码新增了直接插入新记录。
首先新建一个历史表DW_CRM_COMM_CUSTOMER2_HIS
在源表基础上增加 HIS_ID、记录失效时间、记录生效时间、最新记录标志
四个字段
CREATE TABLE
DW_CRM_COMM_CUSTOMER2_HIS
(
HIS_ID VARCHAR(64) NOT NULL,
CUSTOMERCODE VARCHAR(30) NOT NULL,
JYYTX VARCHAR(30),
SQLXX VARCHAR(30),
SCLXX VARCHAR(30),
REC_ONUSE_DATE INTEGER NOT NULL,
REC_DISABLE_DATE INTEGER NOT NULL,
REC_ISNEW_FLG CHARACTER(1)
PRIMARY KEY (HIS_ID,CUSTOMERCODE)
);
COMMENT ON COLUMN DW_CRM_COMM_CUSTOMER2_HIS.REC_ONUSE_DATE IS '记录失效时间';
COMMENT ON COLUMN DW_CRM_COMM_CUSTOMER2_HIS.REC_DISABLE_DATE IS '记录生效时间';
COMMENT ON COLUMN DW_CRM_COMM_CUSTOMER2_HIS.REC_ISNEW_FLG IS '最新记录标志';
首先Designer里先导入源表和目标表:
第一步:创建映射:
源表与目标历史表比较,用查找转换
根据CUSTOMERCODE
判断
然后把源表字段和查找的字段都拖到表达式转换里
,并增加端口字段记录失效时间 REC_ONUSE_DATE、记录生效时间 REC_DISABLE_DATE 、最新记录标志 REC_ISNEW_FLG
其中REC_DISABLE_DATE 表达式为 DECODE($$IS_RUNHIS, 'N', 20190822, 'Y', TO_INTEGER($$ETL_TIME)) 这里有两个参数,要在映射下设置参数,根据是否最新记录,如果是最新则获取当前时间($$ETL_TIME)
。
最后为后面筛选做准备 增加两个端口ISNEW 表达式为 DECODE(lkp_HIS_ID,null,1,0)
这个是根据HIS_ID
判断如果表里没有则返回值1 ; ISCHANGE 表达式为 IIF(JYYTX != lkp_JYYTX OR SQLXX != lkp_SQLXX OR SCLXX != lkp_SCLXX ,1,0)
当源表字段JYYTX、SQLXX、SCLXX
与历史表字段比较有变化时 返回值1 否则返回值0。
1.筛选条件($$IS_RUNHIS = 'N' AND ISNEW = 1) OR ($$IS_RUNHIS = 'Y' AND (ISNEW = 1 OR ISCHANGE = 1))
,表里没有相关数据,则生成一个HIS_ID 并插入其余数据。
插入目标表,可以用序列生成器生成一个HIS_ID
2.筛选条件:$$IS_RUNHIS = 'N' AND (ISNEW=0 AND ISCHANGE=1)
,增加历史记录
3.筛选条件:$$IS_RUNHIS = 'Y' AND (ISNEW = 0 AND ISCHANGE = 1)
更新记录失效时间和是否最新记录
最后Designer完成。
第二步:workflow里创建任务
然后编辑任务,修改相关参数,其中数据库,例如DB2数据库 要在Informatica 服务器上先编目 DB2数据库编目
数据库连接,如果数据库用户名、密码有变动,可以在关系连接里修改。
其中数据库例如DB数据库需要在Informatica服务器上先进行编目,DB2数据库编目
关系连接编辑器里:名称可以自定义,其中连接字符串是 服务器上编目的数据库的别名
;若是连接Oracle数据库 连接字符串是 tnsnames.ora 里的设置的名称
另外要注意session里面的属性页面 ,Designer里有更新模块, Treat source rows as 一般是Data driven,一般正常设计完Designer完成后编辑任务,不大幅度修改Designer ,Treat source rows as 值一般默认都是正确的。
Designer 里如果有UPDTRANS 更新策略,目标表加载方式是data_driven,如果没有一般是insert。
第三步:创建工作流