现在下载的DataCopy版本中多出了两个选项, 他们是: conflict(冲突解决)和filler(过滤列). 命令行中的简单解释如下所示, 不能使人很清楚了解其函义, 需要再特别说明一下.

* conflict= conflict columns for update on target table.
* filler  = filler columns (exclude columns) for target table.

    conflict用于简单解决双向同步时的冲突, 我们可以在被复制的表上加上冲突解决列, 通常是时间或单向增长的列, 在同步时, 更新时要求源端的值一定要大于目标端的值, 以便在双向同步时保留最新的列. 比如在员工表(SCOTT.EMP)中增加一列最后修改时间(LAST_MODIFY), 则可以在DataCopy同步时, 加入conflict参数, 如下所示.

datacopy … table=emp sync=update conflict=last_modify unique=empno

    在这个设置下, 在目标端同步时用的更新SQL中就会加入如下WHERE条件, 对于DELETE操作也一样会加入同样的WHERE条件. 当端源的最后修改时间比目标端小时, 记录才会被更新掉.

UPDATE EMP SET ENAME=:ENAME, ……
WHERE EMPNO=:EMPNO AND LAST_MODIFY <= :LAST_MODIFY

    filler用于快速去掉一些不想同步的列, 选项名称取自sqlldr工具, 这个选项只影响INSERT(包括Direct Path Load)及UPDATE语句. 假如我们不想同步员工表(SCOTT.EMP)的SAL和COMM字段, 则可以用FILLER来去掉这两个字段, 否则需改写源端SQL语句才能实现.

datacopy … table=emp sync=update unique=empno filler=sal,comm

    正在思考如何加入一些公共性的需求到这个小工具里, 如果你有什么想法, 可以告诉我. 另外进行了详细的测试, 目前的程序在Direct Path Load时不能处理ROWID/UROWID类型和TIMESTAMP WITH LOCAL TIME ZONE类型, 后者还会使程序中途退出运行.