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.
缺少以下内容:
同理,CUSTNAME到CUSTADDRESS的映射,需要加上如下派生字段:
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停止做镜像或者刷新动作
- CDC抓取数据过程中所遇到的问题集合
- 建立maven的过程中所遇到的一点问题
- 使用Hibernate过程中所遇到的问题已经解决方法
- hadoop安装过程中所遇到的问题
- oracle biee11g安装过程中所遇到的问题
- liferay过程中使用ajax所遇到的问题
- 开发过程中,所遇到的一部分问题
- 【问题集合】开发过程中遇到的问题
- Linux使用过程中遇到的各种小问题集合
- Android开发过程中遇到的问题集合(—)
- Android编译过程中遇到问题集合
- 网页抓取中遇到的编码问题
- jmeter 所遇到问题 集合
- git 使用过程遇到的问题集合
- git 使用过程遇到的问题集合
- sps备份数据恢复过程中遇到的问题
- sybase数据恢复过程中遇到的问题
- 准备购买数据采集卡过程中遇到的问题
- 第十三周 项目1-3
- android IOS 开发交流群
- linux下tomcat内存溢出
- 关于app断点不停的问题
- window.showModalDialog 在谷歌Uncaught TypeError: undefined is not a function
- CDC抓取数据过程中所遇到的问题集合
- VC++菜单
- 第13周项目1.2
- 第十三周项目1---1
- 第十二周项目一——阅读程序(5)
- 第十三周 项目一--数组大折腾(1)
- 构建基于Jenkins + Github的持续集成环境
- ci操作mysql,查询结果集返回 给对象或者数组
- 在 Mac 上搭建 Ruby on Rails 开发环境