2016-05-06 97 views
0

我有一個過程,它從一個表中選擇數據並插入到另一個。貝婁是程序。甲骨文更新和當前的

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
IS 
BEGIN 
    INSERT INTO NDB_AML_CUSTOMER 
    (ID, TITLE,...) 
    SELECT ID, TITLE,... 
    FROM NDB_CUSTOMER_NEW 
    WHERE DATE_TIME > (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'); 

UPDATE CHECK_POINT SET RUN_DATE = SYSDATE WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'; 

COMMIT; 
END; 
/

在插入發生在12:41:08的情況下,它將選擇源表中存在該點的所有記錄。如果更新語句在12:41:10執行,那麼下一次運行將從那時開始。並且隨着DATE_TIME 12:41:09添加的任何記錄,那麼這些記錄將不會在下一次運行中被選中。

我研究了關於For Update & Current of但我很困惑在哪裏使用它。有什麼建議麼?

回答

2

試試這個。只是在一個變量存儲SYSDATE insert前和使用,在update

CREATE OR REPLACE PROCEDURE "CUSTOMER_INCREMENTAL" (
IS 
v_max_date date; 
BEGIN 
v_max_date:=sysdate; 

    INSERT INTO NDB_AML_CUSTOMER 
    (ID, TITLE,...) 
    SELECT ID, TITLE,... 
    FROM NDB_CUSTOMER_NEW 
    WHERE DATE_TIME > (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'); 

    UPDATE CHECK_POINT SET RUN_DATE = v_max_date 
    WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW'; 


COMMIT; 
END; 
/

另一種方法是使用left join。假設id是主鍵

insert into NDB_AML_CUSTOMER (id,title...) 
select s.id,s.title,... 
from NBD_CUSTOMER_NEW s 
left join NBD_AML_CUSTOMER t 
on s.id=t.id 
where t.id is null 
0

您可以添加最後運行日期到SQL語句不會錯過任何增量。

vd_next_date date; 
    BEGIN 
    vd_next_date:=sysdate; 
INSERT INTO NDB_AML_CUSTOMER 
    (ID, TITLE,...) 
    SELECT ID, TITLE,... 
    FROM NDB_CUSTOMER_NEW 
    WHERE DATE_TIME >= (SELECT RUN_DATE FROM CHECK_POINT WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW') 
AND DATE_TIME < vd_next_date; 

UPDATE CHECK_POINT SET RUN_DATE = vd_next_date 
    WHERE TABLE_NAME = 'NDB_CUSTOMER_NEW';