【问题标题】:Oracle For Update & Current OfOracle For Update 和 Current Of
【发布时间】:2016-05-06 04:11:06
【问题描述】:

我有一个过程,它从一个表中选择数据并插入到另一个表中。下面是过程。

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 执行,则下一次运行将从该时间开始。并且使用 12:41:09 的 DATE_TIME 添加的任何记录都不会在下一次运行中被选中。

我研究了For UpdateCurrent of,但我不知道在哪里使用它。有什么建议吗?

【问题讨论】:

    标签: oracle procedure


    【解决方案1】:

    试试这个。只需将 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
    

    【讨论】:

      【解决方案2】:

      您可以在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';
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-05
        • 2017-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多