最近比較流行,這種通過ETL同步數(shù)據(jù)到中間表狭姨,再到業(yè)務表的方式去開發(fā)宰啦。這種存儲過程結(jié)構(gòu)差不多,所以饼拍,直接貼出一個例子赡模,就不多去解釋了。需要用到的师抄,直接復制過去漓柑,改一下表名,和更新的字段名叨吮,即可使用辆布。
CREATE OR REPLACE PROCEDURE PROC_SYNC_ABNORMAL_SETTLEMENT AS
? LAST_SYNC_TIME DATE; --業(yè)務表最新修改時間
BEGIN
--找出業(yè)務表中最新修改時間。由于一開始業(yè)務表是空的茶鉴,所以锋玲,要使用到nvl()函數(shù)
? SELECT nvl(MAX(modify_tm),
? ? ? ? ? ? to_date('2000-01-1 01:00:00', 'yyyy-mm-dd hh24:mi:ss'))
? ? INTO LAST_SYNC_TIME
? ? FROM ET_ABNORMAL_SETTLEMENT;
--插入數(shù)據(jù),首先涵叮,過濾出中間表中修改時間>業(yè)務表中最新更新時間的數(shù)據(jù)惭蹂,再去判斷業(yè)務表中是否存在這樣的ID伞插,如無,則進行插入操作盾碗。
? INSERT INTO ET_ABNORMAL_SETTLEMENT EA
? ? SELECT *
? ? ? FROM MID_ABNORMAL_SETTLEMENT MA
? ? WHERE MODIFY_TM > LAST_SYNC_TIME
? ? ? AND NOT EXISTS
? ? (SELECT ID FROM ET_ABNORMAL_SETTLEMENT WHERE ID = MA.ID);
? -- 批量更新
--過濾出中間表中修改時間>業(yè)務表中最新更新時間的數(shù)據(jù)蜂怎,再去判斷業(yè)務表中是否存在這樣的ID,如有置尔,則進行更新操作杠步。
? FOR I IN (SELECT *
? ? ? ? ? ? ? FROM MID_ABNORMAL_SETTLEMENT MA
? ? ? ? ? ? WHERE MA.MODIFY_TM > LAST_SYNC_TIME
? ? ? ? ? ? ? and EXISTS
? ? ? ? ? ? (SELECT ID FROM ET_ABNORMAL_SETTLEMENT WHERE ID = MA.ID)) LOOP
? ? BEGIN
? ? ? UPDATE ET_ABNORMAL_SETTLEMENT
? ? ? ? SET TRADE_CODE = I.TRADE_CODE,
? ? ? ? ? ? SETTLEMENT_AREA = I.SETTLEMENT_AREA,
? ? ? ? ? ? ACCOUNT_CODE = I.ACCOUNT_CODE,
? ? ? ? ? ? ACCOUNT_NAME = I.ACCOUNT_NAME,
? ? ? ? ? ? WAYBILL_MONTH = I.WAYBILL_MONTH,
? ? ? ? ? ? HANDLE_STATE = I.HANDLE_STATE,
? ? ? ? ? ? EXCEPTION_TYPE = I.EXCEPTION_TYPE,
? ? ? ? ? ? TASK_ID = I.TASK_ID,
? ? ? ? ? ? REPEAT_TASK_ID = I.REPEAT_TASK_ID,
? ? ? ? ? ? TASK_STATE = I.TASK_STATE,
? ? ? ? ? ? GPS_VALID = I.GPS_VALID,
? ? ? ? ? ? VALID_SOURCE = I.VALID_SOURCE,
? ? ? ? ? ? LINE_CODE = I.LINE_CODE,
? ? ? ? ? ? CONTRACT_SERVICE_TYPE = I.CONTRACT_SERVICE_TYPE,
? ? ? ? ? ? TRANSPORT_WAY = I.TRANSPORT_WAY,
? ? ? ? ? ? RUN_MODE = I.RUN_MODE,
? ? ? ? ? ? PRICING_MANNER = I.PRICING_MANNER,
? ? ? ? ? ? PROOF = I.PROOF,
? ? ? ? ? ? AUDIT_INSTRUCTIONS = I.AUDIT_INSTRUCTIONS,
? ? ? ? ? ? REASON_CANCELLATION = I.REASON_CANCELLATION,
? ? ? ? ? ? CANCEL_USER = I.CANCEL_USER,
? ? ? ? ? ? CANCEL_TM = I.CANCEL_TM,
? ? ? ? ? ? TASK_DEPT_CODE = I.TASK_DEPT_CODE,
? ? ? ? ? ? PROOF_USER = I.PROOF_USER,
? ? ? ? ? ? PROOF_TM = I.PROOF_TM,
? ? ? ? ? ? PREFETCH_EXEC_STATUS = I.PREFETCH_EXEC_STATUS,
? ? ? ? ? ? REQUIRE_PLAN_ID = I.REQUIRE_PLAN_ID,
? ? ? ? ? ? REQUIRE_ID = I.REQUIRE_ID,
? ? ? ? ? ? ACTUAL_WEIGHT = I.ACTUAL_WEIGHT,
? ? ? ? ? ? MODIFY_EXPLAIN = I.MODIFY_EXPLAIN,
? ? ? ? ? ? MODIFY_USER = I.MODIFY_USER,
? ? ? ? ? ? MODIFY_TM = I.MODIFY_TM,
? ? ? ? ? ? IS_DISPOSE = I.IS_DISPOSE
? ? ? WHERE ID = I.ID;
? ? END;
? END LOOP;
? COMMIT;--記得執(zhí)行完,要進行提交
EXCEPTION
? WHEN OTHERS THEN
? ? DBMS_OUTPUT.PUT_LINE('Exception happened,data was rollback');
? ? ROLLBACK;--有異常則回滾
END;