ORACLE job操作

Oracle 10g新增了scheduler的功能,功能比job强大的很多,Oracle官方也建议将job转移到scheduler 。 


先解释一下基础概念,scheduler 包含了以下几个实体对象
Program -- 提供了scheduler 将要运行什么,包含program name,program type(PLSQL块、存储过程、外部程序),program action(具体的程序实体,比如说一个PLSQL块、或者是存储过程的名称、或者是外部程序的路径加名称) 。

Schedules -- 指定何时何种频率来运行job,可以被不同的job重复的利用。比如说我有两个job都要求在每天的凌晨4点运行,那么两个job可以同时指定相同的schedule。

Jobs -- 具体的作业的名称,依赖于那个program、schedule。也可以不指定program、schedule,而直接写入program、schedule的相应参数。

Chains -- 把一组program像一个单独的实体连接在一起,作为一个对象。Job可以指向Chains代替单一的program 。这样就能完成类似如下功能:运行A,然后运行B,当A、B都运行成功则运行C,否则运行D。

下面参考文档边看边做。

  1.创建一张表  create table scheduler_test(id number,instime date);

  2.创建一个存储过程,实现往表中插入资料。

create or replace procedure p_insSysdate as
   id number;
begin
   select count(*) into id from scheduler_test;
   insert into scheduler_test values(id,sysdate);
   commit;
end;
/
  3.创建一个schedule,这个仅仅是一个时间上的安排,由DBMS_SCHEDULER.CREATE_JOB调用。这样就可以重用schedule,并且schedule在时间的安排上强大与原先的JOB 。语法如下:

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_SCHEDULE
    (
      schedule_name    => 'SCOTT.EVERY_MINUTE'
     ,start_date       => NULL
     ,repeat_interval  => 'FREQ=MINUTELY'
     ,end_date         => NULL
     ,comments         => NULL
    );
END;
/

   以下给出部分repeat_interval的写法实例,以供参考
EVERY DAY                                                    'FREQ=DAILY;INTERVAL=1'
EVERY MINUTE                                             'FREQ=MINUTELY;INTERVAL=1'
EVERY 4 HOURS ON THE HOUR             'FREQ=HOURLY;INTERVAL=4;BYMINUTE=0;BYSECOND=0'
1st DAY OF EVERY MONTH                        'FREQ=DAILY;BYMONTHDAY=1'
WEEKDAYS AT 7am and 3pm                    'FREQ=DAILY; BYDAY=MON,TUE,WED,THU,FRI; BYHOUR=7,15; BYMINUTE=0;BYSECOND=0'

   4.创建DBMS_SCHEDULER.CREATE_PROGRAM,指定运行什么样的程序。

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_PROGRAM
    (
      program_name         => 'SCOTT.PRG_INSSYSDATE'
     ,program_type             => 'STORED_PROCEDURE'
     ,program_action         => 'p_insSysdate'
     ,number_of_arguments  => 0
     ,enabled                       => TRUE
     ,comments                   => NULL
    );
END;
/

program_type有三类 'PLSQL_BLOCK','STORED_PROCEDURE','EXECUTABLE'分别表示program_action为PLSQL块、存储过程、外部操作系统程序。number_of_arguments表需要传入的参数个数,至于参数如何传入,以后再来研究。

5. 现在来创建一个JOB,并使用先前的schedule、program 。

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_JOB
    (
       job_name        => 'SCOTT.JOB_INSSYSDATE'
      ,schedule_name   => 'SCOTT.EVERY_MINUTE'
      ,program_name    => 'SCOTT.PRG_INSSYSDATE'
      ,comments        => NULL
    );
END;
/

DBMS_SCHEDULER.CREATE_JOB中有一个参数auto_drop,如果设置成TRUE,job执行完成或者job变成disabled则job自动被删除。如下三种情况job被认为是completed
1) Its end date (or its schedule's end date) has passed.
2) It has runmax_runsnumber of times.max_runsmust be set withSET_ATTRIBUTE.
3) It is not a repeating job and has run once.

下面来查看一下

select * from scheduler_test;

        ID INSTIME
---------- ------------
         0 14-AUG-08
         1 14-AUG-08
         2 14-AUG-08

表中已经有内容,说明job已经运行起来了。

如何让job停下来?分为两种情况:一种是停止正在运行的job,
begin
  dbms_scheduler.STOP_JOB('job_insSysdate');
end;
会提示如下错误:ORA-27366 job 'scott.job_insSysdate' is not running .
另一种是使job disabled,
begin
  dbms_scheduler.DISABLE('job_insSysdate');
end;
可以通过查看job的状态,确认是否使job失效。
select enabled,status from user_scheduler_jobs;

dbms_scheduler.DISABLE 的name参数可以是program、schedule、job等对象。可以disabled的前提是该对象没有被其他的对象引用,比如job_insSysdate引用了prg_insSysdate,如果job_insSysdate为enabled,这时不能直接disabled prg_insSysdate . 
 
一般流程:
1.创建存储过程

create procedure sandypro
is
v_userid varchar2(40);
begin
select replace(dbms_random.random(),'-','') into v_userid from dual;
insert into sandytest(userid,username,usersex,muser,mdate,mtime) values(v_userid,'test','男','sandy',20120522,101010);
commit;
end sandypro;

begin
sandypro;
end;

2.创建JOB
Begin
dbms_scheduler.create_job(
  job_name                =>'sandyjob',
  job_type                =>'STORED_PROCEDURE',
  job_action              =>'sandypro',
  start_date              =>sysdate,
  repeat_interval         =>'FREQ=Hourly',
  comments                =>'TEST'
);
End;
 
3.设置存储JOB的存储过程的参数(没参数则不用)
   BEGIN
    DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
        JOB_NAME      
=> 'sandyjob' ,
        ARGUMENT_POSITION 
=>   1 ,
        ARGUMENT_VALUE     
=>   0
    );
END ;
4.启动JOB
   BEGIN
        DBMS_SCHEDULER.enable(
'sandyjob');
END;
5.查询JOB
SELECT *  FROM USER_SCHEDULER_JOBS;
6.停用JOB
   BEGIN
        DBMS_SCHEDULER.disable(
'sandyjob');
END;
7.删除JOB
   BEGIN
        DBMS_SCHEDULER.drop_job(
'sandyjob');
END;

 

8.停止正在运行的JOB
   BEGIN
        DBMS_SCHEDULER.stop_job(
'sandyjob');
END;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值