oracle中dbms_scheduler简单用法

 

job是什么呢? 简单的说就是计划(schedule)加上任务说明. 另外还有一些必须的参数.

这里提到的"任务"可以是数据库内部的存储过程,匿名的PL/SQL块,也可以是操作系统级别的脚本.

可以有两种方式来定义"计划":
1) 使用DBMS_SCHDULER.CREATE_SCHEDULE 定义一个计划;
2) 调用DBMS_SCHDULER.CREATE_JOBE过程直接指定 (下面会详细说明)

在创建一个计划时,你至少需要指定下面的属性,它们是job运行所必须的:

开始时间 (start_time);

重复频率 (repeat_interval);

结束时间 (end_time)


另外,对于一个job而言,还有很多的附加参数:

job_class
job_priority
auto_drop
restartable
max_runs
max_failures
schedule_limit
logging_level

---创建表
CREATE TABLE "SHIHUA"."A_TESTDATE"
   ( "BTIME" DATE,
 "ETIME" DATE
   )
  ---创建存储过程
   CREATE OR REPLACE PROCEDURE "SHIHUA"."TEST_DATE1" is
tempSql varchar2(4000);--临时语句
begin
  tempSql := 'insert into a_testdate(btime,etime) values(sysdate,sysdate)';
  execute immediate tempSql;
COMMIT;
  --insert into a_testdate(btime,etime) values(sysdate,sysdate );
end test_date1;
/
--创建job

BEGIN
   DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'J_P1',  -- JOB名字
                             JOB_TYPE        => 'STORED_PROCEDURE', -- 类型,这
                             JOB_ACTION      => 'P1', -- 存储过程
                             START_DATE      => to_date('2017-01-01','yyyy-mm-dd'),
                             REPEAT_INTERVAL => 'FREQ=DAILY;BYHOUR=2',  -- 时间间隔 每天2点
                             ENABLED         => TRUE,
                             COMMENTS        => '每天2点计算XXX数据JOB');  -- 注释内容
END;
/


---启动job
dbms_scheduler.enable(NAME => 'job_test_insert'); 
-- 运行Job 
 dbms_scheduler.run_job(job_name => 'job_test_insert', 
                        use_current_session => FALSE); 

job_name: 顾名思义,每个job都必须有一个的名称
schedule_name: 如果定义了计划,在这里指定计划的名称
job_type: 目前支持三种类型:

PL/SQL块: PLSQL_BLOCK,
存储过程: STORED_PROCEDURE
外部程序: EXECUTABLE (外部程序可以是一个shell脚本,也可以是操作系统级别的指令).

job_action: 根据job_type的不同,job_action有不同的含义.
如果job_type指定的是存储过程,就需要指定存储过程的名字;
如果job_type指定的是PL/SQL块,就需要输入完整的PL/SQL代码;
如果job_type指定的外部程序,就需要输入script的名称或者操作系统的指令名
---停止job
BEGIN 
   dbms_scheduler.disable(NAME => 'job_test_insert'); 
END;

---查询语句
select * from A_TESTDATE;

-- 删除job 
BEGIN 
  dbms_scheduler.drop_job(JOB_NAME => 'job_test_insert'); 
END; 

如何查询job:

有两种方法:

1) 查询(DBA|ALL|USER)_SCHEDULER_JOBS 视图
(提示: 根据用户权限的不同,选择性的查询 DBA|ALL|USER视图)

2) 调用DBMS_SCHEDULER包中的GET_ATTRIBUTE 过程

执行频率:

10G 支持两种模式的repeat_interval,一种是PL/SQL表达式,这也是dbms_job包
中所使用的,例如SYSDATE+1, SYSDATE + 30/24*60; 另一种就是日历表达式。
例如MON表示星期一,SUN表示星期天,DAY表示每天,WEEK表示每周等等. 下面来
看几个使用日历表达式的例子:

每隔5s:REPEAT_INTERVAL=SECONDLY;INTERVAL=5
每小时:REPEAT_INTERVAL=HOURLY;INTERVAL=1
每天2点:REPEAT_INTERVAL=DAILY;BYHOUR=2
每天运行一次job :repeat_interval => 'FREQ=DAILY'
每周的1,3,5运行job:repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"
每年的3,6,9,12月的30号运行job:repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'

下面再说说使用日历表达式的规则:

日历表达式基本分为三部分: 第一部分是频率,也就是"FREQ"这个关键字,
它是必须指定的; 第二部分是时间间隔,也就是"INTERVAL"这个关键字,
取值范围是1-999. 它是可选的参数; 最后一部分是附加的参数,可用于
精确地指定日期和时间,它也是可选的参数,例如下面这些值都是合法的:
BYMONTH,BYWEEKNO,BYYEARDAY,BYMONTHDAY,BYDAY
BYHOUR,BYMINUTE,BYSECOND
还有:

repeat_interval :

1/24 :一小时

1/1440 : 一分钟

1/(3600*24) : 一秒钟

sysdate+1 : 每天运行一次

sysdate+1/24 : 每一小时运行一次

sysdate+1/1440 : 每一分钟运行一次

sysdate+1/(3600*24) : 每一秒钟运行一次

sysdate+7 : 每星期运行一次

trunc(sysdate+1) : 每天午夜12点

trunc(sysdate+1)+(8*60+30)/(24*60) : 每天早上8:30

trunc(last_date(sysdate)+1) : 每个月第1天的午夜12点

next_day(trunc(sysdate),"tuesday"+12/24) : 每星期二中午12点

你可能感兴趣的:(ORACLE)