而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.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