日期:2014-05-16  浏览次数:20429 次

oracle produce 同步中间库
在一个已有系统上做外网系统,考虑到服务器压力或者没有条件直接连接已有系统的数据库。需要弄一个中间库在特定时间进行业务数据的同步。需要注意的写法
INSERT INTO sy_api_c_meter
		(task_id, meter_id, .... .)
		SELECT in_task_id, meter_id,.. ..
			FROM c_meter a, c_mp b, c_meter_mp_rela c
		 WHERE a.meter_id = c.meter_id
					 AND b.mp_id = c.mp_id
					 AND b.cons_id = v_cons_id
					 AND b.org_no = v_org_no

上面的sql中select 查询语句没有性能问题,分区条件和索引都能走上,但是在一起执行insert 时就会很卡。这是刚开始写过程时会犯的错误。应该使用游标,修改结果如下:
FOR cur IN (SELECT c.meter_id
              FROM c_mp b, c_meter_mp_rela c
             WHERE b.mp_id = c.mp_id
                   AND b.cons_id = v_cons_id
                   AND b.org_no = v_org_no)
LOOP
    INSERT INTO sy_api_c_meter
        (task_id, meter_id, inst_loc,....)
        SELECT in_task_id, meter_id, ....
          FROM c_meter a
         WHERE a.meter_id = cur.meter_id;
END LOOP;

在实际操作中对表数据的批量操作,循环操作的速度要快很多。