调度scheduler_job
create table aa(id number,name varchar2(20));
create or replace procedure proc_aa
as
begin
for i in 1…100 loop
insert into aa(id,name) values(i,i||‘aa’);
end loop;
end;
–创建scheduler_job
PLSQL_BLOCK --------------------
begin
dbms_scheduler.create_job(job_name => ‘savedate’, --作业名称
job_type => ‘PLSQL_BLOCK’, --作业类型
job_action => ‘begin
insert into times1 values(sysdate);
end;’,
start_date => sysdate, --开始时间
repeat_interval => ‘freq=minutely;interval=1’,
enabled => true, --启用
auto_drop => true); --应该设置终止时间,才会自动drop
end;
execdbms_scheduler.disable(‘savedate’); --终结作业 测试可行
execdbms_scheduler.drop_job(‘savedate’); --删除作业 测试可行
stored_procedure--------------------
begin
dbms_scheduler.create_job(job_name => ‘savedate’, --作业名称
job_type => ‘stored_procedure’, --作业类型,可以设为存储过程
job_action => ‘hr.refresh_summaries’ --村粗过程的名称
start_date => sysdate, --开始时间
repeat_interval => ‘freq=minutely;interval=1’,
enabled => true, --启用
auto_drop => true, --应该设置终止时间,才会自动drop
comments => ‘update summary tables’);
end;
executable--------------------
begin
dbms_scheduler.create_job
(
job_name => ‘ARC_MOVE’,
schedule_name => ‘EVERY_60_MINS’,
job_type => ‘EXECUTABLE’,
job_action => ‘/home/dbtools/move_arcs.sh’,
enabled => true,
comments => ‘Move Archived Logs to a Different Directory’
);
end;
其他的一些类型
BEGIN
DBMS_SCHEDULER.drop_job(job_name => ‘test_prog_job’, force => TRUE);
dbms_scheduler.drop_schedule(schedule_name => ‘test_schedule’,force => TRUE);
dbms_scheduler.drop_program(program_name => ‘test_prog’, force => TRUE);
END;
begin
–dbms_scheduler.enable(‘BACKUP_JOB’); – job 启用
–dbms_scheduler.run_job(‘COLA_JOB’,true); – true代表同步执行
–dbms_scheduler.stop_job(‘savedate’,TRUE);
dbms_scheduler.drop_job(job_name => ‘savedate’,force => true);
end;
创建scheduler
Begin
dbms_scheduler.create_schedule(
repeat_interval => ‘FREQ=DAILY;BYHOUR=4;BYMINUTE=0;BYSECOND=0’,
start_date => trunc(sysdate+1)+20/2460,
comments => ‘—this is my test schedule—’,
schedule_name => ‘MYTEST_SCHEDULE’);
end; 测试通过
select * fromdba_scheduler_schedules; --schedules视图
创建program
BEGINDBMS_SCHEDULER.CREATE_PROGRAM(program_name=>‘mytest_program_1’,program_action=>‘update mytest set id=id+1;’,program_type=>‘PLSQL_BLOCK’, – ‘stored_procedure’number_of_arguments=>0,comments=>’—this is my test program—’,enabled=>TRUE);END;select * from dba_scheduler_programs; --program视图查看创建JOB(scheduler绑定program)
BEGIN
DBMS_SCHEDULER.create_job (job_name => ‘test_byhour_job’,
program_name => ’ mytest_program_1’,
schedule_name => ’ MYTEST_SCHEDULE ', --注意没有duler
enabled => TRUE,
comments => ‘test per hour’);
END;
select * fromdba_scheduler_schedules; --查看job
select * fromdba_scheduler_job_run_details; --查看scheduler运行记录
–设置属性
BEGIN
DBMS_SCHEDULER.set_attribute(NAME => ‘hourly_schedule’,
attribute => ‘repeat_interval’,
VALUE => ‘freq=hourly; byminute=1;bysecond=0;INTERVAL=1;’);
END;
–创建Chain
SQL> exec dbms_scheduler.create_chain(‘my_chain1’); --创建chain
–创建chain对象
SQL> begin
2 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
3 chain_name => ‘my_chain1’,
4 step_name => ‘my_step1’, —创建对象名
5 program_name => ‘p1’); --添加program——name
6 end;
7 /
SQL> begin
2 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
3 chain_name => ‘my_chain1’,
4 step_name => ‘my_step2’,
5 program_name => ‘p2’);
6 DBMS_SCHEDULER.DEFINE_CHAIN_STEP (
7 chain_name => ‘my_chain1’,
8 step_name => ‘my_step3’,
9 program_name => ‘p3’);
10 end;
11 /
–创建chain rule
SQL> BEGIN
2 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
3 chain_name => ‘my_chain1’,
4 condition => ‘TRUE’, —实现运行对象1—my_step1
5 action => ‘START my_step1’,
6 rule_name => ‘my_rule1’); —rule 1
7 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
8 chain_name => ‘my_chain1’,
9 condition => ‘my_step1 completed’, —对象1,成功,则运行对象2
10 action => ‘START my_step2’,
11 rule_name => ‘my_rule2’); ----rule 2
12 DBMS_SCHEDULER.DEFINE_CHAIN_RULE (
13 chain_name => ‘my_chain1’,
14 condition => ‘my_step2 completed’, --对象2成功,则结束
15 action => ‘end 0’, --一定要设置,否则job会一直挂起,不结束。
16 rule_name => ‘my_rule3’); ----rule 3
17 END;
18 /
–激活chain。此步骤非常重要,默认的chain为禁用。
exec dbms_scheduler.enable(name => ‘my_chain1’);
EXEC DBMS_SCHEDULER.drop_job(job_name => ‘CHAIN_JOB_1’,force => true); --true不加引号,要小写,否则报错
–运行chain
SQL> BEGIN
2 DBMS_SCHEDULER.RUN_CHAIN (
3 chain_name => ‘my_chain1’,
4 start_steps => ‘my_step1’);
5 END;
6 /
–创建job(chain 类型)
SQL> BEGIN
2 DBMS_SCHEDULER.CREATE_JOB (
3 job_name => ‘chain_job_1’,
4 job_type => ‘CHAIN’,
5 job_action => ‘my_chain1’,
6 repeat_interval => ‘freq=daily;interval=1’,
7 enabled => TRUE);
8 END;
9 /
10G 支持两种模式的repeat_interval,一种是PL/SQL表达式,这也是dbms_job包中所使用的,例如SYSDATE+1, SYSDATE + 30/2460; 另一种就是日历表达式。例如MON表示星期一,SUN表示星期天,DAY表示每天,WEEK表示每周等等. 下面来看几个使用日历表达式的例子:
repeat_interval => 'FREQ=HOURLY; INTERVAL=2’每隔2小时运行一次job
repeat_interval => 'FREQ=DAILY’每天运行一次job
repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"
每周的1,3,5运行job
repeat_interval => ‘FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30’
每年的3,6,9,12月的30号运行job
REPEAT_INTERVAL => ‘FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI’; 每隔一周周五运行
REPEAT_INTERVAL => ‘FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10’; 每年3月10日运行
REPEAT_INTERVAL => ‘FREQ=MONTHLY; BYMONTHDAY=-1’; 每月底执行
REPEAT_INTERVAL => ‘FREQ=DAILY; INTERVAL=10’; 每隔10天运行
REPEAT_INTERVAL => ‘FREQ=DAILY; BYHOUR=16,17,18’; 每天4.5.6点运行
REPEAT_INTERVAL => ‘FREQ=HOURLY; INTERVAL=50’; 每50小时执行一次
普通job
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20 修改可运行job的最大个数
select name,description from v$bgprocess; 查看job queue 后台进程
create table HR.TIMES1
(CL DATE)tablespace USERS);
create or replace procedure MYPROC as
begin
insert into TIMES1 values(sysdate);
commit;
end;
dba_jobs_running, dba_jobs 记录再运行的jobs dba_scheduler_jobs 时间窗口的job
job的建立,两种方式都可
一、PLSQL BLOCK-------------------------------------------
SQL> variable job1 number;
SQL> begin
2 dbms_job.submit(:job1,‘begin
3 insert into times1 values(sysdate);
4 end;’,sysdate,‘sysdate+1/1440’);
5 end;
6 /
二、STORED PROCEDURE--------------------------------------
Dbms_job.submit(:job1,’MYPROC;’,SYSDATE,’sysdate+1/1440’,true/false(是否立马解析));
Variable job1 number
Begin
Dbms_job.submit(:job1,’MYPROC;’,SYSDATE,’sysdate+1/1440’);
Commit;
End;
Job的删除过程
Begin
Dbms_job.remove(45); --此处的编号为job号,dba_jobs.job
Commit;
End;
Job手动运行
Begin
Dbms_job.run(45);
End;
手动停止JOB
SQL> EXEC DBMS_JOB.broken(64,true); commit; --手动停止64号JOB
SQL> EXEC DBMS_JOB.broken(64,false); commit; --手动启动job作业
SQL> exec dbms_job.broken(186,false,next_day(sysdate,‘monday’)) //标记为非broken,指定执行时间
删除job:dbms_job.remove(jobno);
修改要执行的操作:job:dbms_job.what(jobno,what);
修改下次执行时间:dbms_job.next_date(job,next_date);
修改间隔时间:dbms_job.interval(job,interval);
停止job:dbms.broken(job,broken,nextdate);
启动job:dbms_job.run(jobno);
INTERVAL参数值:
每天午夜12点 ‘TRUNC(SYSDATE + 1)’
每天早上8点30分 ‘TRUNC(SYSDATE + 1) + (860+30)/(2460)’
每星期二中午12点 ‘NEXT_DAY(TRUNC(SYSDATE ), ‘‘TUESDAY’’ ) + 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, '‘SATURDAY"), NEXT_DAY(SYSDATE, “SUNDAY”))) + (6×60+10)/(24×60)’
创建作业
create table times1 (cl date);
select * from times1;
alter session set nls_date_format=‘dd-mm-yy hh24:mi:ss’;
begin
dbms_scheduler.create_job(job_name => ‘savedate’, --作业名称
job_type => ‘PLSQL_BLOCK’, --作业类型
job_action => ‘begin
insert into times1 values(sysdate);
end;’,
start_date => sysdate, --开始时间
repeat_interval => ‘freq=minutely;interval=1’,
enabled => true, --启用
auto_drop => true); --应该设置终止时间,才会自动drop
end;
execdbms_scheduler.disable(‘savedate’); --终结作业
execdbms_scheduler.drop_job(‘savedate’); --删除作业
存储结构类型
begin
dbms_scheduler.create_job(job_name => ‘savedate’, --作业名称
job_type => ‘stored_procedure’, --作业类型,可以设为存储过程
job_action => ‘hr.refresh_summaries’ --村粗过程的名称 start_date => sysdate, --开始时间
repeat_interval => ‘freq=minutely;interval=1’,
enabled => true, --启用
auto_drop => true, --应该设置终止时间,才会自动drop
comments => ‘update summary tables’);
end;
begin
dbms_scheduler.enable(‘BACKUP_JOB’); – job 启用
dbms_scheduler.run_job(‘COLA_JOB’,TRUE); – true代表同步执行
dbms_scheduler.stop_job(job_name => ‘COLA_JOB’,force => TRUE);
dbms_scheduler.drop_job(job_name => ‘COLA_JOB’,force => TRUE)?
end
作业类型可以使程序名、PL/SQL、存储过程、可执行程序、链
dba_scheduler_jobs 可看系统已经分配的job。
dba_jobs_running, dba_jobs 记录再运行的jobs dba_scheduler_jobs 时间窗口的job
Variable job1 number
Begin
Dbms_job.submit(:job1,’MYPROC’,SYSDATE,’sysdate+1/1440’);
End;
Begin
Dbms_job.run(:job1);
End;