CDC抓取数据过程中所遇到的问题集合

来源:互联网 发布:网络名字大全女孩四字 编辑:程序博客网 时间:2024/04/30 14:16

1. 关于过滤POSTCODE LIKE '%8%'

 

CDC里面支持过滤条件,但过滤条件只能是个布尔值;而你所列的条件的返回值非布尔值,所以可以考虑定义一个存储过程,通过存储过程来判断。满足条件时存储过程返回值为1,否则为0。然后看在过滤条件中判断该行是否满足条件。

此处,对于ADDRESS到CUST_ADDRESS的表映射,需要定义的过滤条件为:

%USERFUNC("STOREDPROC","DB2INST1.SELECT_POSTCODE",POSTCODE)=1

进行的操作就是先调用存储过程DB2INST1.SELECT_POSTCODE,POSTCODE为存储过程的输入值。关于%USERFUNC的语法,请查看:

http://pic.dhe.ibm.com/infocenter/cdc/v6r5m1/index.jsp?topic=%2Fcom.ibm.cdcdoc.mcadminguide.doc%2Frefs%2Fuserfunc.html

 

存储过程DB2INST1.SELECT_POSTCODE代码:

@

CREATE OR REPLACE PROCEDURE SELECT_POSTCODE

(OUT RESULT1 int, IN POSTCODE VARCHAR(10))

 LANGUAGE SQL

 BEGIN

 IF(POSTCODE LIKE '%8%') THEN

 SETRESULT1=1;

 ELSE

 SETRESULT1=0;

 ENDIF;

 END

@

 

下图是在MC中的配置演示:

 

这里一个过滤条件不完全!应该为如下:

%USERFUNC("STOREDPROC","DB2INST1.SELECT_POSTCODE",POSTCODE)=1AND %GETCOL(KEY, " DB2INST1.CUSTNAME", -1, KEY, KEY) <> -1

 

 

2. 关于源表字段合并,如例子中的A1.NAME|| '-' ||A2.CITY AS NAME_CITY

 

对于合并出新的字段,可以在MC中定义派生字段(derived column)。

 

该派生字段需要和目标字段拥有一致的类型,在合并时需要用到CDC的函数%CONCAT。由于该合并还牵涉到其他的表CUSTNAME,则需要调用CDC的%GETCOL来通过主键值来查找对应的CUSTNAME的表中的NAME值。所以最终的派生表达式定义如下图示:

%GETCOL(NAME,"ODSCIF.TEST_LIUSW_CUSTNAME","<NONAME>",KEY,KEY)

%GETCOL(需要查找的表的显示字段,需要查找的表, 需要查找的表如果找不到该条记录则显示的值, 需要查找的表的KEY,主表的KEY)

 

 

 

定义好后,把新生成的派生字段通过拖拽映射到目标端的NAME_CITY字段即可。

 

%CONCAT的使用方法:

http://pic.dhe.ibm.com/infocenter/cdc/v6r5m1/index.jsp?topic=%2Fcom.ibm.cdcdoc.mcadminguide.doc%2Frefs%2Fconcatenation.html

 

%GETCOL的使用方法:

http://pic.dhe.ibm.com/infocenter/cdc/v6r5m1/index.jsp?topic=%2Fcom.ibm.cdcdoc.mcadminguide.doc%2Fconcepts%2Fretrievingcolumn.html

 

http://pic.dhe.ibm.com/infocenter/cdc/v6r5m0/index.jsp?topic=%2Fcom.ibm.cdcdoc.mcadminguide.doc%2Frefs%2Fretrievecolumn_SQL.html

 

http://pic.dhe.ibm.com/infocenter/iidr/v10r1m2/index.jsp?topic=%2Fcom.ibm.cdcdoc.sysreq.doc%2Fconcepts%2Fsupporteddatabases.html

 

刚才,我们完成了对ADDRESS表到CUST_ADDRESS表的映射。下面要对CUSTNAME表到CUST_ADDRESS的映射。

 

由于目标表中要求过滤条件,但CUSTNAME表本身不含有POSTCODE字段,所以在调用存储过程进行判断时要把输入参数值POSTCODE通过%GETCOL函数来取得,最终的过滤条件如下图所示:

%USERFUNC("STOREDPROC","DB2INST1.SELECT_POSTCODE",%GETCOL(POSTCODE,"DB2INST1.ADDRESS", "<NONAME>",KEY, KEY))=1

 

然后,对于该表映射中的目标字段NAME_CITY,相应地也要建立派生字段,对于该映射中的派生字段定义如下:

 

然后保存即可。

 


注意:到目前为止,所有的定义都完成。但是有一个情况,当CUSTNAME里面新增一条记录时,如果对应的ADDRESS表没有相关联的记录,则这条新增记录不会被复制到目标表中(因为有过滤条件POSTCODE LIKE '%8%')。但如果之后ADDRESS表中又新增了一条记录,且该记录的键值和之前CUSTNAME新增的键值一致,会存在一种情况最终组合出的目标表记录不包含NAME字段内容(因为之前被过滤掉了)。所以可以考虑给ADDRESS到CUST_ADDRESS的表映射再定义一个派生字段NAME,通过%GETCOL直接取CUSTNAME里面的NAME值:

 

DB2INST1.

 

缺少以下内容:

同理,CUSTNAMECUSTADDRESS的映射,需要加上如下派生字段:

ADDRESS%GETCOL(ADDRESS, "DB2INST1.ADDRESS", "<NO ADDRESS>", KEY, KEY)

CITY%GETCOL(CITY, "DB2INST1.ADDRESS", "<NO CITY>", KEY, KEY)

PROV%GETCOL(PROV, "DB2INST1.ADDRESS", "<NO PV>", KEY, KEY)

POSTCODE%GETCOL(POSTCODE, "DB2INST1.ADDRESS", "<NO PC>", KEY, KEY)

 

 

CDC还有其他的字段函数,可以达到不能的数据变换需求。你可以参考一下:

http://pic.dhe.ibm.com/infocenter/cdc/v6r5m1/index.jsp?topic=%2Fcom.ibm.cdcdoc.mcadminguide.doc%2Fconcepts%2FColumnFunctions.html

5.CDC在抓数据的过程中,在监视窗口刷新数据出现一下情况有可能是源数据违反了目标库中所建立的主键跟唯一索引的使用:

6.CDC在抓数据的时候,要注意目标表的字符集是否跟源表的字符集一样,如果不一样,请设置目标库上表的Encoding,如果想限制源数据的抽取数据段大小,请在Filtering中设置,无需加where,直接添加条件即可。

7.CDC第一次做镜像的时候也会做全表覆盖,如果的第二次做镜像的话,那么请在编辑table mapping页面上刷新一次并把Status状态由Active改成Refresh,然后再做镜像或者刷新都可以,做镜像的话就是如果源表有新的数据就会抓取新的数据,如果源表没有新的数据,将不会抓取数据,刷新的话就会做全表覆盖动作。
,Start Mirroring 是开始做镜像,Start Start Refresh 开始刷新,End Rep;ocation停止做镜像或者刷新动作

0 0
原创粉丝点击