我对DBA概念很陌生。作为工作的一部分,我创建了一个内部数据集市。通过使用数据库链接,我已连接到不同的源,并且请求的数据是将信息存储在此市场中。我们要求我通过数据库链接连接的数据源每天都在变化。所以我们想跟踪那些数据中的变化。所以我创建了一个物化视图,并编写了一个程序,在一个月内刷新一次这些表。意味着主表总是在一个月内用新数据刷新一次,我们将旧数据发送到历史表。所以在刷新这些表之前,我写了一个简单的逻辑来将数据从主表移动到历史表。 例: 假设employee表作为主表,为了维护该表的历史记录,我正在编写一个简单的语句,如
create table employee_hst as select * from employee;
(带时间戳)
但这个简单的陈述不符合我的目的。
因为我的要求是我应该保持历史只有6个月。我的意思是历史表应该只保存6个月的历史数据。所以请告诉我如何在hist数据中只保存6个月的数据,超过6个月的数据应该自动删除。
请帮助您提出建议。
提前致谢
答案 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)
您可以创建
的存储过程where DateCreated < Sysdate - 180
答案 2 :(得分:0)
您可以在employee表上创建一个将在INSERT / UPDATE / DELETE上执行的触发器,它将执行以下两项操作:1)复制历史记录表中的当前记录。历史表将有一个单独的字段作为varchar [20]或类似的东西,它将保存动作“INSERT / UPDATE / DELETE”以及时间戳字段。它将执行的第二个操作是删除历史表中超过180天的任何记录。
答案 3 :(得分:0)
几乎所有RDBMS都有一些完整的调度服务,包括Oracle。
您最好的选择是为此服务添加预定作业,以删除超过6个月(或180天或您拥有的内容)的所有历史记录。