Oracle-任务调度(DBMS_Scheduler)
Dbms_Scheduler
Oracle 10g 之前,可以使用dbms_job来管理定时任务:
dbms_job.submit(job=>outjob,what=>'pro_name;',next_date=>sysdate,inteval=>'sysdate+1/24');
10g 之后,Oracle 引入了dbms_scheduler 和 program ,在功能方面,它比dbms_job提供了更强大的功能和灵活的机制/管理。
使用dbms_scheduler 创建一个定时任务有两种形式:
- 创建一个scheduler来定义计划,一个program来定义任务内容,在创建一个job,为这个job指定上面的scheduler和program
- 直接创建job,在参数里面直接指定计划和任务内容
要执行dbms_scheduler需要create job 权限
select * from dba_sys_privs where grantee=upper('t1'); --dba权限
grant create job to t1 --授权
- 示例
--建立测试表
create table test_t1(id integer,create_date date);
--建立存储过程
create or replace procedure test_p1
is
v_maxid test_t1.id%type:=1;
begin
select nvl(max(id),0) into v_maxId from test_t1;
insert into test_t1 values(v_maxid,sysdate);
commit;
end test_p1;
--建立作业
declare
v_count int:=0;
begin
select count(*) into v_count from user_scheduler_jobs where job_name=upper('test_job1');
if v_count>0 then
dbms_scheduler.drop_job(upper('test_job1'));
end if;
dbms_scheduler.create_job(
job_name=>'test_job1', --必选 任务名称
job_type => 'STORED_PROCEDURE',--必须 任务类型【存储过程,匿名块等】
job_action=>'TEST_P1',--必须 任务内容,与job_type配合使用
start_date => sysdate, --可选 首次执行时间,为空时表示立即执行
repeat_interval=>'FREQ=MINUTELY;INTERVAL=1', --可选,执行频率,为空时表示只执行一次
--【FREQ=minutely; 表示间隔单位,可选值Yearly,monthly,weekly,datly,hourly,minutely,secondly】
enabled=>true); --可选 是否启用任务,注意:这里是enabled;
end;