【问题标题】:last updated date using oracle 11g使用 oracle 11g 的最后更新日期
【发布时间】:2016-02-27 16:26:59
【问题描述】:

目前,我有一个进程每 2 小时执行一次,该进程基于在 oracle 11g 表上每 2 小时更新一次。

update_date >= sysdate -2/24  

无论如何,我是否可以每 2 小时运行一次工作并捕获自上次更新运行以来的更新。

谢谢

【问题讨论】:

  • 您需要安排一个作业并在每次运行作业时将最大更新日期存储在某处。

标签: sql oracle11g


【解决方案1】:

这是一个简化的示例:

1) 设置数据结构并初始化作业状态

CREATE TABLE ak_job_state(last_date DATE);
INSERT INTO ak_job_state VALUES (SYSDATE-2/24);

CREATE TABLE ak_example(c_name VARCHAR2(100), last_updated DATE);

2) 设置JOB流程:

CREATE OR REPLACE PROCEDURE check_for_updated IS
  v_last_date DATE;
  v_new_date  DATE;
BEGIN
  SELECT last_date INTO v_last_date FROM ak_job_state FOR UPDATE NOWAIT; --get the date from storage (meanwhile serialize the access)

  v_new_date := SYSDATE; --make new date state

  FOR x IN (SELECT * FROM ak_example WHERE last_updated > v_last_date) LOOP

    --Do your stuff;
    NULL;
  END LOOP;

  UPDATE ak_job_state SET last_date = v_new_date; --Save the state
  COMMIT;
END;
/

3) 并安排 JOB,有关 Oracle 文档中调度程序的更多详细信息:https://docs.oracle.com/cd/B28359_01/server.111/b28310/schedadmin006.htm

BEGIN
  dbms_scheduler.create_job(job_name        => 'check_for_updated_job'
                           ,job_type        => 'PLSQL_BLOCK'
                           ,job_action      => 'BEGIN check_for_updated; END;'
                           ,start_date      => SYSDATE
                           ,repeat_interval => 'FREQ=HOURLY;INTERVAL=2'
                           ,enabled         => TRUE
                           ,comments        => 'Update every 2 hours');
END;
/

【讨论】:

    猜你喜欢
    • 2017-07-09
    • 2021-08-20
    • 2012-08-03
    • 2021-09-16
    • 2011-04-01
    • 1970-01-01
    • 2014-09-08
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多