GoldenGate中使用strcat和strext進行資料轉換

margiex發表於2014-11-27
在OGG中可以對源欄位的內容進行合併或拆分,從而實現類似於“ETL”的功能。
strcat(s1,s2,s3,,,):用於合併字串;
strext(str, start, end):用於獲取指定位置的字串。
示例如下:

源端myphone表,2個欄位:
SQL> desc myphone
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 AREA_CODE                                          NUMBER
 PHONE_NO                                           NUMBER
 
目標端myphone表,只有一個欄位:
SQL> desc myphone
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PHONE_NO                                           VARCHAR2(30)
 
 
因此目標表在接收到資料之後,我們可以將2個欄位合併為一個,前面加上“0”,欄位間使用“-”連線,表示一個完整的電話號碼。
源端OGG捕獲及傳輸程式:
extract ext
userid ggs_owner, password ggs_owner
rmthost venom , mgrport 7809
rmttrail ./dirdat/gg
table ggs_owner.myphone;

目標端投遞程式:
REPLICAT rep
sourcedefs ./dirsql/myphone.sql
USERID ggs_owner, PASSWORD ggs_owner
MAP ggs_owner.myphone, TARGET ggs_owner.myphone,
COLMAP (phone_no=@STRCAT("0",area_code,"-",phone_no));

啟動兩個程式並在源端插入一些資料,源端:
SQL> select * from myphone;

 AREA_CODE   PHONE_NO
---------- ----------
         8   92471136
         4   17213124
         2     818188
目標端:
SQL> select * from myphone;

PHONE_NO
------------------------------
08-92471136
04-17213124
02-818188
可以看到欄位已經按我們的要求進行合併。

針對欄位拆分:
源端:
SQL> select * from myssid;

      SSID
----------
 123456787
 123456788
 123456789

將SSID表的9位數字投遞到目標端時拆分成如下格式:
SQL> select * from myssid;

SSID
--------------------
123-456-787
123-456-788
123-456-789

我們需要在目標端程式如下配置:
REPLICAT rep
sourcedefs /export/home/oracle/gg/dirsql/myssid.sql
USERID ggs_owner, PASSWORD ggs_owner
MAP ggs_owner.myssid, TARGET ggs_owner.myssid,
COLMAP (ssid=@STRCAT(@STREXT(ssid,1,3),"-",@STREXT(ssid,4,6),"-",@STREXT(ssid,7,9) ));

可以看到,使用strcat, strext可以很容易的實現在實時資料同步時,進行簡單的資料轉換,從而實現部分ETL功能。

相關文章