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功能。