利用merge优化

create table a1(TP_END_DATE NUMBER,WK_END_DATE NUMBER,
MTH_START_DATE NUMBER,
MTH_END_DATE NUMBER,
TIME_PERD_START_DATE NUMBER);

create table a2(TP_END_DATE DATE ,WK_END_DATE DATE,MTH_START_DATE DATE,MTH_END_DATE DATE,DAY_DATE DATE) ;


SQL> select * from a1;

TP_END_DATE WK_END_DATE MTH_START_DATE MTH_END_DATE TIME_PERD_START_DATE
----------- ----------- -------------- ------------ --------------------
   19990101    19990101       19990101	   19990101		29990101

SQL> select * from a2;

TP_END_DA WK_END_DA MTH_START MTH_END_D DAY_DATE
--------- --------- --------- --------- ---------
01-JAN-99 01-JAN-99 01-JAN-99 01-JAN-99 01-JAN-99


BEGIN

Update  ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
TP_END_DATE =
 ( select TO_NUMBER(TO_CHAR((TP_END_DATE),'YYYYMMDD')) from CAL_MASTR_DIM b 
where a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

Update ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
WK_END_DATE = 
( select TO_NUMBER(TO_CHAR((WK_END_DATE),'YYYYMMDD') from CAL_MASTR_DIM b where
 a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

Update  ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
MTH_START_DATE = 
( select TO_NUMBER(TO_CHAR((MTH_START_DATE),'YYYYMMDD') from CAL_MASTR_DIM b where 
a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

Update  ADWGU_DICFR.DICFR_ORDR_CUT_FCT a
Set
MTH_END_DATE = 
( select TO_NUMBER(TO_CHAR((MTH_END_DATE),'YYYYMMDD') from CAL_MASTR_DIM b where 
a.TIME_PERD_START_DATE= TO_NUMBER(TO_CHAR((b.DAY_DATE),'YYYYMMDD')));

COMMIT;

END;
/


改为merge:
merge into a1 a
using a2 b
on (a.TIME_PERD_START_DATE = TO_NUMBER(TO_CHAR((b.DAY_DATE), 'YYYYMMDD')))
WHEN MATCHED THEN
  UPDATE
     SET a.TP_END_DATE = TO_NUMBER(TO_CHAR((b.TP_END_DATE), 'YYYYMMDD')),
         a.WK_END_DATE = TO_NUMBER(TO_CHAR((b.WK_END_DATE),'YYYYMMDD')),
          a.MTH_START_DATE = TO_NUMBER(TO_CHAR((b.MTH_START_DATE),'YYYYMMDD')),
           a.MTH_END_DATE = TO_NUMBER(TO_CHAR((b.MTH_END_DATE),'YYYYMMDD'))
原文地址:https://www.cnblogs.com/hzcya1995/p/13352445.html