在一个数据交换场景中,对方提供一个远程数据库,我方根据时间戳提取增量数据,经转换处理后存到我方数据库的表中。
对方数据有以下特征:
1.增量数据数量较大;
2.数据不规范,部分数据无法直接写入我方数据库。
考虑有以下几个方法来处理:
方案一、对每条数据loop循环处理,写入错误则记录后跳过;
方案二、在insert时对数据进行函数校验,符合条件的才写入;
仔细考虑这2中方案:
方案一对每条记录做loop循环无疑耗费了大量时间在远程链路上,对于数据量较大的情况时间代价太大。
方案二如果校验比较复杂,则用于函数校验的成本也很大;再者对错误数据的处理可能会造成更多的工作量。
详细分析后,我们提出使用forall的save exception机制来处理这个场景。
假设对方数据库远程链接名是db2,远程表t_exch结构如下:
SQL> desc t_exch
Name Type Nullable Default Comments
---------- -------------- -------- ------- --------
GUID VARCHAR2(50)
NAME VARCHAR2(30) Y
STIME VARCHAR2(20) Y
ETIME VARCHAR2(20) Y
CONTENT VARCHAR2(4000) Y
STATUS VARCHAR2(1) Y
CREATEDATE DATE Y
MOBILE VARCHAR2(20) Y
SQL> select * from t_exch where rownum<5;
GUID NAME STIME ETIME