1. 程式人生 > >CDC抓取資料過程中所遇到的問題集合

CDC抓取資料過程中所遇到的問題集合

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", "<NO NAME>",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停止做映象或者重新整理動作