03-017 oracle定时任务
程序员文章站
2022-05-07 16:28:48
...
每天凌晨0:00:00备份一个表,且以当天时间为准,过去7天每天备份一次。
思路:
- 创建一个存储过程
- 利用定时任务每天凌晨0:00:00执行一次
1、创建一个存储过程
create or replace procedure prc_ams_asset as
v_date varchar2(8); --定义日期变量
v_dated varchar2(8); --定义7天前日期
v_sql varchar2(2000); --定义动态sql
v_sqld varchar2(2000); --定义动态sql
v_tablename varchar2(30); --定义动态表名
v_tablenamed varchar2(30); --定义动态表名
begin
select to_char(sysdate, 'yyyymmdd') into v_date from dual; --取日期变量
select to_char(sysdate - 7, 'yyyymmdd') into v_dated from dual; --取日期变量
v_tablename := 'ams_asset_info_prc' || v_date; --为动态表命名
v_tablenamed := 'ams_asset_info_prc' || v_dated; --为动态表命名
v_sql := 'create table ' || v_tablename ||
' as select * from ams_asset_info';
v_sqld := 'drop table ' || v_tablenamed;
dbms_output.put_line(v_sql); --打印sql语句
execute immediate v_sql; --执行动态sql
execute immediate v_sqld; --执行动态sql
exception
when others then
null;
end prc_ams_asset;
创建好之后,call prc_ams_asset(); 会立即运行第一次,或者用定时任务也会立即运行第一次
2、利用定时任务每天执行一次
当前用户定时任务
select count() from user_jobs;
有权限访问的定时任务
select count() from all_jobs;
整个数据库所有定时任务
select count(*) from dba_jobs;
1、查出原来定时任务的JOBID
SELECT t.* FROM dba_jobs t where what = 'PRC_AMS_ASSET;'
2、删除该定时任务
begin
dbms_job.remove(第一步查询出的JOBID); /*删除自动执行的job,参数是 job的id*/
commit;
end;
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => job,
WHAT => 'PRC_AMS_ASSET;',
next_date => to_date('22-05-2019 03:00:00', 'dd-mm-yyyy hh24:mi:ss'),
INTERVAL => 'TRUNC(sysdate) + 1+ (0/24)' /*每天凌晨0点*/
);
commit;
end;