2016-05-06 2 views
0

У меня есть процедура, в которой он выбирает данные из таблицы и вставляет в другую. Пыль - это процедура.Oracle для обновления и текущего

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'; 
Смежные вопросы