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
---启动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点