暂无图片
OGG实时同步当源端字段值为1时,目标端该字段改为0 ,当源端字段为0或空值时,目标端该字段改为1,这个好通过OGG参数去实现吗?
我来答
分享
悠悠鱼梦
2021-03-19
OGG实时同步当源端字段值为1时,目标端该字段改为0 ,当源端字段为0或空值时,目标端该字段改为1,这个好通过OGG参数去实现吗?

OGG实时同步当源端字段值为1时,目标端该字段改为0 ,当源端字段为0或空值时,目标端该字段改为1,这个好通过OGG参数去实现吗?
或者是通过触发器去实现?但是数据库主机资源紧张,用触发器会占用资源。

我来答
添加附件
收藏
分享
问题补充
5条回答
默认
最新
杨卓

上一个回复使用char字段,发现null无法进行转换,如下测试表字段类型转换为varchar2,使用上面大佬说的两种参数,可以参照如下。
使用EVAL
SQL> desc test1
Name Null? Type


ID NUMBER(38)
NAME VARCHAR2(10)
SQL> insert into test1(id) values(7);
SQL> insert into test1 values(8,null);
SQL> insert into test1 values(9,1);
SQL> insert into test1 values(10,‘1’);
SQL> insert into test1 values(11,‘0’);

map test2.test1, target test2.test1,COLMAP(usedefaults,NAME=@EVAL(NAME=‘1’,‘0’,NAME=‘0’,‘1’,‘1’));
ID NAME


     7 1
     8 1
     9 0
    10 0
    11 1

map test2.test1, target test2.test1,COLMAP(usedefaults,NAME=@case(NAME,‘1’,‘0’,‘0’,‘1’,‘1’));
SQL> insert into test1(id) values(12);
SQL> insert into test1 values(13,null);
SQL> insert into test1 values(14,‘1’);
SQL> insert into test1 values(15,‘0’);
12 1
13 1
14 0
15 1

暂无图片 评论
暂无图片 有用 0
暂无图片
weizhao.zhang (anbob)

可以的,
colmap @Case, @Eval,@ If

暂无图片 评论
暂无图片 有用 1
悠悠鱼梦

能再详细点吗,@Eval,@ If这两个参数怎么用?
当源端字段值为1时,目标端该字段改为0,replicate配置:COLMAP (“CUSTOMER_ID”=“ORG_CUSTOMER_ID”, USEDEFAULTS, “CUST_NAME”=“CUST_NAME”, “ORG_ID”=“ORG_ID”, USEDEFAULTS,ENABLED=@CASE(SELF_IS_QCH,“1”,“0”));
另外一种情况,当源端字段为0或空值时,目标端该字段改为1,这个如何配置?

暂无图片 评论
暂无图片 有用 0
悠悠鱼梦

试着这样配置:
COLMAP (“CUSTOMER_ID”=“ORG_CUSTOMER_ID”, USEDEFAULTS, “CUST_NAME”=“CUST_NAME”, “ORG_ID”=“ORG_ID”, USEDEFAULTS,ENABLED = @EVAL (“SELF_IS_QCH”=1,“0”,“SELF_IS_QCH”=0,“1”,“SELF_IS_QCH”=NULL,“1”));

结果报错:
2021-03-22 10:33:06 INFO OGG-01298 Oracle GoldenGate Delivery for MySQL, rep1.prm: Column function diagnostic message: could not find column “0”.
2021-03-22 10:33:06 ERROR OGG-00919 Oracle GoldenGate Delivery for MySQL, rep1.prm: Error in COLMAP clause.

暂无图片 评论
暂无图片 有用 0
杨卓

map test2.test1, target test2.test1,COLMAP(usedefaults,CC=@case(CC,‘1’,‘0’,‘0’,‘1’,‘1’));

Source
SQL> insert into test1 values(1,1);
1 row created.
SQL> commit;
Target
select * from test1;
ID CC


     1 0

Source
SQL> insert into test1 values(2,0);
SQL> insert into test1(id) values(3);
SQL> insert into test1 values(4,null);

Target
ID CC


     1 0
     2 1
     3
     4

参考
https://docs.oracle.com/en/middleware/goldengate/core/19.1/reference/case.html#GUID-6517C335-E905-4FF1-83A8-72D785AFB536

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏