昨天,查看ogg发现有进程abend.
这是一个rep进程,已经稳定运行2年多了。
查看报错是一个列映射错误的提示。(内网,具体报错记不清了)
过程
1.查看rep端的.prm参数,发现最近没有修改
2.对比源端和目标端表的映射关系,源端的表结构是否变化
3.查看两端的def文件。
都没有发现结果。但是这个进程确实稳定运行很长时间了,不会突然报错。自己对比了一下映射关系和表结构
结果发现,映射关系没变,但是一个表在源端是varchar2(256),目标端是varchar2(8),那么该如何处理
------------------------------------------------------------------------------------------------------------------------------------------------
百度一下发现有这篇文章,很有帮助,我只选取了@strext的方法。要注意的是@strext使用的时候是从1开始而不是零
如我的phone=@strext(phone,1,8),而不是phone=@strext(phone,0,7)
文章出处: http://www.cnblogs.com/margiex/p/4127224.html
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功能。