如果是10g的话就用scheduler来代替job吧,比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; /
|