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设置方法
- 每天午夜12点 trunc(sysdate+1)
- 每天早上8点30分 trunc(sysdate+1)+(860+30)/(2460)
- 每星期二中午12点 next_day(trunc(sysdate),'tusday')+12/24
- 每个月第一天午夜12点 trunc(last_day(sysdate)+1)
- 每个季度最后一天的晚上11点 trunc(add_months(sysdate+2/24,3),'Q')-1/24
- 每星期六和日早上6点10分 trunc(least(next_day(sysdate,"staturday"),next_day(sysdate,"sunday")))+(660+10)/2460
- 每秒钟执行一次 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