暂无图片
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
打赏 0
暂无图片
weizhao.zhang (anbob)

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

暂无图片 评论
暂无图片 有用 1
打赏 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
打赏 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
打赏 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
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
请问rac下2套db,给第二个db配置em时老是报错,提示密码不对,但用密码是可以登陆的,有人遇到过吗?
回答 1
是在最后搜索添加数据库的时候报错吗
在一个高并发的MySQL数据库环境中,哪一个设置能够帮助减少不必要的行级锁冲突,同时保持良好的数据一致性和事务隔离?
回答 1
已采纳
B)设置innodbautoinclockmode2(即:INTERLEAVED模式)
tnsping 响应时间达到2s有些慢
回答 5
已采纳
有人说可以,把日志删除,会好点,但解决不了问题。300811/export/home/oracle/script/clearLsnLog.sh>/dev/null2>&1oracl
Oracle 用存储过程来删除数据,一次性删除300万数据用时1小时20分钟,效率低吗?
回答 4
已采纳
很低了。存储过程落地也是调用delete语句。而且一次大量delete通常要考虑好rede和undo,避免刷爆,非常危险的操作。。。建议将需要的数据通过createtablea1asselectfro
Oracle 12c和19c的jdk驱动包是一个版本吗 ?
回答 1
已采纳
对,都是jdk1.8
unix 下怎么调整数据库的时间?
回答 1
一般来说你调整os的时间,数据库会跟着一起变的。
mysql阻塞疑问,发现dml语句被select语句阻塞的情况,且select不是for update
回答 3
查看一下datalocks表呢?有可能是元数据锁导致的
11c 如何查出是哪个ip地址导致账号被锁的?
回答 1
已采纳
如果数据库开启了审计(模式DBExtended),则可以用以下SQL查到,如果没有开审计,则需要建立触发器去跟踪,就看你有没有建立了,可以查查所有的触发器。SELECTUSERNAME,USERHOS
Oracle 怎么查看wrapped 加密后的包体原始内容
回答 2
已采纳
可以解密,墨天轮有一个在线工具:https://www.modb.pro/unwrap
业务程序偶尔找不到package,必须重启数据库才能好,这是为什么?打开10046事件截图如下
回答 2
可能是对象失效了,检查一下。