JOB的使用合集

本文详细介绍了Oracle数据库中调度器的使用方法,包括创建不同类型的作业(如PL/SQL块、存储过程、可执行文件和链),设置作业的重复间隔,以及如何启用、运行、停止和删除作业。同时,文章还提供了创建调度、程序和链的步骤,并解释了如何通过日历表达式设置重复间隔。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调度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/24
60; 另一种就是日历表达式。例如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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值