如何保持6个月的历史数据?

时间:2013-03-26 17:08:05

标签: sql oracle10g

我对DBA概念很陌生。作为工作的一部分,我创建了一个内部数据集市。通过使用数据库链接,我已连接到不同的源,并且请求的数据是将信息存储在此市场中。我们要求我通过数据库链接连接的数据源每天都在变化。所以我们想跟踪那些数据中的变化。所以我创建了一个物化视图,并编写了一个程序,在一个月内刷新一次这些表。意味着主表总是在一个月内用新数据刷新一次,我们将旧数据发送到历史表。所以在刷新这些表之前,我写了一个简单的逻辑来将数据从主表移动到历史表。 例: 假设employee表作为主表,为了维护该表的历史记录,我正在编写一个简单的语句,如

create table employee_hst as select * from employee;(带时间戳)

但这个简单的陈述不符合我的目的。

因为我的要求是我应该保持历史只有6个月。我的意思是历史表应该只保存6个月的历史数据。所以请告诉我如何在hist数据中只保存6个月的数据,超过6个月的数据应该自动删除。

请帮助您提出建议。

提前致谢

4 个答案:

答案 0 :(得分:1)

这是基于scott.emp表所需的简化版本。首先是向您展示查询和输出。您也可以使用INTERVAL或ADD_MONTHS获取过去6个月的数据:

SELECT * FROM
(
 SELECT deptno, empno, ename, end_date AS hiredate
      , TRUNC(MONTHS_BETWEEN(sysdate, end_date)) months_of_service  
  FROM emp_test
)
WHERE months_of_service <= 6 -- past 6 moths data only
ORDER BY 1
/

DEPTNO    EMPNO    ENAME     HIREDATE    MONTHS_OF_SERVICE
------------------------------------------------------------
10        7782     CLARK     11/2/2012    4
10        7934     MILLER    9/2/2012     6
...
20        7902     FORD      9/2/2012     6
20        7566     JONES     10/2/2012    5
...
30        7935     WALSH     12/2/2012    3
30        7900     JAMES     9/2/2012     6
30        7844     TURNER    1/27/2013    1
...

下面的示例基于您的帖子 - 您希望每次都重新创建表并使用数据填充它。您也可以截断表并重新插入数据 - 由您决定。我个人会选择truncate / insert而不是动态地删除/创建表。

使用表名作为参数创建过程,或手动运行块,或使用DBMS_SCHEDULER或其他工具安排它,以便每次传递给SCHEDULER时自动运行。

在表名之前添加模式名称。如果表已经存在,则从代码中删除异常部分,然后在Drop table part下面运行。如果你得到“ORA-00942:表或视图不存在”,那么你需要一个例外。

DECLARE
  v_tab_name VARCHAR2(100):= 'emp_test2';
BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE '|| v_tab_name; -- may truncate then insert 
  -- This exception will handle ORA-00942: table or view does not exist
  -- If table already exists before you run this then you may remove it from code
  EXCEPTION WHEN OTHERS 
  THEN
    BEGIN
      EXECUTE IMMEDIATE 'CREATE TABLE '||v_tab_name||' AS -- or insert into select...
                  SELECT * FROM
                   (
                   SELECT deptno, empno, ename, end_date
                        , TRUNC(MONTHS_BETWEEN(sysdate, end_date)) months_of_service  
                     FROM emp_test
                   )
                   WHERE months_of_service <= 6
                  ORDER BY 1'; 

       EXCEPTION WHEN OTHERS THEN dbms_output.put_line(SQLCODE||' '||SQLERRM); 
    END;
 END;
/

答案 1 :(得分:0)

您可以创建

的存储过程
  1. 插入历史记录
  2. 刷新已证实的视图
  3. 从历史记录中删除where DateCreated < Sysdate - 180

答案 2 :(得分:0)

您可以在employee表上创建一个将在INSERT / UPDATE / DELETE上执行的触发器,它将执行以下两项操作:1)复制历史记录表中的当前记录。历史表将有一个单独的字段作为varchar [20]或类似的东西,它将保存动作“INSERT / UPDATE / DELETE”以及时间戳字段。它将执行的第二个操作是删除历史表中超过180天的任何记录。

答案 3 :(得分:0)

几乎所有RDBMS都有一些完整的调度服务,包括Oracle

您最好的选择是为此服务添加预定作业,以删除超过6个月(或180天或您拥有的内容)的所有历史记录。