Oracle定时任务dbms_scheduler

1. 简介
在Oracle 10g之前,我们通过DBMS_JOB来管理定时任务;

而10g之后,则推荐使用DBMS_SCHEDULER来管理定时任务,因为它提供了更强大的功能和灵活的机制。

2. 需要的权限
CREATE JOB -- (必须, 要执行DBMS_SCHEDULER, 需要有create job权限)
CREATE EXTERNAL JOB -- (可选, 创建执行操作系统命令的job时需要)
# 查询用户所拥有的角色以及角色所包含的权限
select * from role_sys_privs where role in (
select granted_role from dba_role_privs where grantee='SCOTT'
) order by role;
# 查询直接授予用户的权限
select * from dba_sys_privs where grantee='SCOTT';

3. 一个简单的Demo
3.1 创建JOB

create table test_t1(id int, create_date date);
create or replace procedure test_p1
is
 v_maxId test_t1.id%type := 1;
begin
 select nvl(max(id), 0) into v_maxId from test_t1;
 insert into test_t1 values(v_maxId + 1, sysdate);
 commit;
end test_p1;
/
declare
 v_count int := 0;
begin
 select count(*) into v_count from user_scheduler_jobs where job_name='TEST_JOB1';
 if v_count > 0 then
  dbms_scheduler.drop_job('TEST_JOB1');
 end if;
 dbms_scheduler.create_job (
  job_name    => 'test_job1',
  job_type    => 'STORED_PROCEDURE',
  job_action   => 'TEST_P1',
  start_date   => sysdate,
  repeat_interval => 'FREQ=MINUTELY;INTERVAL=1',
  enabled     => true
 );
end;
/

# 参数说明

job_name        : 必选, 任务名称
job_type        : 必选, 任务类型(
                    PLSQL_BLOCK,      -- 执行一个PL/SQL匿名快
                    STORED_PROCEDURE, -- 执行一个存储过程
                    EXECUTABLE,       -- 执行一个外部程序
                    CHAIN             -- 执行一个CHAIN
                  )
job_action      : 必选, 任务内容, 与job_type配合使用
start_date      : 可选, 首次执行时间, 为空时表示立即执行
repeat_interval : 可选, 执行频率, 为空时表示只执行一次(
                    FREQ=MINUTELY; -- 表示间隔单位, 可选值有YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY
                    INTERVAL=1     -- 表示间隔周期
                  )
enabled         : 可选, 是否启用任务
详细参数可参考: http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#ARPLS72960
3.2 查看JOB执行情况
-- 查看已创建的JOB
select job_name, job_type, enabled, state from user_scheduler_jobs;
-- 查看JOB运行日志
select log_id, log_date, status from user_scheduler_job_run_details where job_name='TEST_JOB1';

3.3 删除JOB
exec dbms_scheduler.drop_job('TEST_JOB1');

# 相关链接
http://blog.itpub.net/7607759/viewspace-610951
http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sched.htm#ARPLS72300

你可能感兴趣的:(scheduler)