因为有一张中转数据的表,数据量特别大不能保存太久,但是最近几天的有可能要使用。所以只保留7天的数据量,其他的数据按月重新建表分开保存,用以备份。
首先创建备份的存储过程
CREATE OR REPLACE PROCEDURE P_DAYCLEAR IS
V_TABLE_COUNT int;
V_TABLE_NAME VARCHAR2(100);
V_YEAR_MONTH VARCHAR2(100);
v_sql VARCHAR2(300);
c_sql VARCHAR2(300);
BEGIN
select to_char(sysdate - interval '7' day, 'yyyyMM')
into V_YEAR_MONTH
from dual;
V_TABLE_NAME := 'DSM_COM_INDEX_HIS_VALUE' || V_YEAR_MONTH;
select count(*)
into V_TABLE_COUNT
from user_tables
where table_name = V_TABLE_NAME;
--判断表是否已经存在了
IF V_TABLE_COUNT = 0 THEN
--建表
c_sql :='create table '||V_TABLE_NAME||' as select * from DSM_COM_INDEX_HIS_VALUE where 1=2 ';
execute immediate c_sql ;
commit;
END IF;
select to_char(sysdate - interval '6' day, 'yyyy-MM-dd')
into V_YEAR_MONTH
from dual;
V_SQL := 'insert into '||V_TABLE_NAME||' select * from DSM_COM_INDEX_HIS_VALUE where update_time < to_date(:1, ''yyyy-MM-dd'')';
--插数据
execute immediate V_SQL USING V_YEAR_MONTH ;
COMMIT;
--删除数据
V_SQL := ' delete from DSM_COM_INDEX_HIS_VALUE where update_time < to_date(:1, ''yyyy-MM-dd'') ';
execute immediate V_SQL USING V_YEAR_MONTH ;
COMMIT;
END P_DAYCLEAR;
然后创建定时任务 晚上执行
declare
job_id pls_integer;
begin
sys.dbms_job.submit(job => job_id,
what => 'P_DAYCLEAR();',
next_date => to_date('10-03-2018 03:00:00', 'dd-mm-yyyy hh24:mi:ss'),
interval => 'TRUNC(sysdate+86400)');
commit;
end;