Oracle 作业

Oracle 定时自动执行任务-作业(dbms_job)

说明:

Oracle 视图 User_Jobs 是Oracle数据库中的一个视图,包含当前用户拥有的所有系统作业信息,用户可以通过该视图查询用户作业,并获取相关信息,比如作业名称、作业状态、运行状态。
使用Oracle 视图User_Jobs 有一下两种方法:

1.使用select 语句查询user_jobs 视图
select * from user_jobs;
2. 使用dbms_jobs包来管理user_jobs视图

  • 提交作业
dbms_job.submit(job out binary_integer,
                                 what in varcha2,
                                 next_date in date default sysdate,
                                 interval in varchar2 default 'null',
                                 no_parse in boolean default false,--是否需要解析与job相关的过程
                                 instance in binary_integer default 0,--指定那个实例可以运行job
                                 force in boolean default false);--是否前置运行与job相关的实例

示例
1.首先创建一个表,用于存储数据

create table dbms_job_history(message varchar2(100),create_date date);  

2.创建一个存储过程

create or replace procedure p_dbms_job_test as
begin
     insert into dbms_job_history(message,create_date) values('dbms_job',sysdate);
     commit;
end;

2.每三分钟调用一次过程p_dbms_job_test

declare
job_out binary_integer;
begin
        dbms_job.submit(
        job=>job_out,
        what=>'p_dbms_job_test();',
        next_date=>sysdate, --立即执行
        interval=>'sysdate+1/1440'); --每分钟执行一次
        commit;
end;
Interval设置方法
  1. 每天午夜12点 trunc(sysdate+1)
  2. 每天早上8点30分 trunc(sysdate+1)+(860+30)/(2460)
  3. 每星期二中午12点 next_day(trunc(sysdate),'tusday')+12/24
  4. 每个月第一天午夜12点 trunc(last_day(sysdate)+1)
  5. 每个季度最后一天的晚上11点 trunc(add_months(sysdate+2/24,3),'Q')-1/24
  6. 每星期六和日早上6点10分 trunc(least(next_day(sysdate,"staturday"),next_day(sysdate,"sunday")))+(660+10)/2460
  7. 每秒钟执行一次 inteval=>sysdate+1/(246060)
  • 例如:每天凌晨1点执行 interval=>trunc(sysdate)+1+1/(24)
  • 暂停
procedure broken(job in binary_integer,broken in boolean,next_date in date default sysdate);
  • 示例
begin
    dbms_job.broken(job=>26,broken=>true);
    commit;
end;
  • 修改
procedure change(job in binary_integer,
                                what in varchar2,
                                next_date in date,
                                interval in varchar2,
                                instance in binary_integer default null,
                                force in boolean default false);
  • 示例
begin
  dbms_job.interval(job=>26,interval=>'sysdate,3/1440');
  commit;
end;
  • 运行
procedure run(job in binary_integer,force in boolean default false);
  • 示例
begin
  dbms_job.run(job=>26);
  commit;
end;
  • 删除
procedure remove(job in binary_integer,force in boolean default false);
  • 批量删除
begin
  for v in (select job from user_jobs where log_user='&user') loop
     dbms_job.remove(v.job);
  end loop;
  commit;
end;
  • 示例
begin
  dbms_job.remove(job=>26);
  commit;
end;

Interval

1.每分钟执行
Interval=>Trunc(sysdate,'mi')+1/(24*60)
2.每天凌晨1点
Interval=>Trunc(sysdate)+1+1/24)
3.每天固定时间运行,比如早上8:10
interval=>trunc(sysdate+1)+(8*60+10)/24*60

posted @ 2023-04-10 14:05  丹心石  阅读(139)  评论(0编辑  收藏  举报