联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
长期以来,一直对DBMS_SCHEDULER包比较模糊,今天抽一点时间,通过一点试验,理清自己的思路,分清楚各个函数大概作用.不至于在以后使用该包的时候一片空白.
1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job
SQL> create table t_xifenfei (x_type varchar2(10),x_date date); 表已创建。 SQL> begin 2 DBMS_SCHEDULER.create_job ( 3 job_name => 'f_create_job', 4 job_type => 'PLSQL_BLOCK', 5 job_action => ' 6 begin 7 insert into t_xifenfei values(''job'',sysdate); 8 commit; 9 end; 10 ', 11 enabled => true, 12 start_date => SYSTIMESTAMP, 13 repeat_interval => 'SYSTIMESTAMP + 1/1440', 14 comments => 'xifenfei_create_job'); 15 END; 16 / SQL> select x_type,to_char(x_date,'yyyy-mm-dd hh24:mi:ss') from t_xifenfei; X_TYPE TO_CHAR(X_DATE,'YYY ---------- ------------------- job 2012-06-19 19:52:11 job 2012-06-19 19:53:11 job 2012-06-19 19:54:11
这里的使用方法和dbms_jobs有几分类此,不过这个提供了加灵活的使用方法,比如可以执行匿名块,执行操作系统命令等
2.CREATE_JOB结合CREATE_PROGRAM
SQL> create or replace procedure p_xifenfei(in_type in varchar2) 2 is 3 begin 4 insert into t_xifenfei values(in_type,sysdate); 5 commit; 6 end; 7 / 过程已创建。 SQL> begin 2 DBMS_SCHEDULER.CREATE_PROGRAM( 3 program_name => 'x_program', 4 program_action => 'p_xifenfei', 5 program_type => 'STORED_PROCEDURE', 6 number_of_arguments => 1, 7 comments => 'xifenfei_PROGRAM', 8 enabled => false); 9 end; 10 / PL/SQL 过程已成功完成。 SQL> begin 2 DBMS_SCHEDULER.define_program_argument( 3 program_name => 'x_program', 4 argument_position => 1, 5 argument_type => 'VARCHAR2', 6 default_value => 'program'); 7 END; 8 / PL/SQL 过程已成功完成。 SQL> exec DBMS_SCHEDULER.enable('x_program'); PL/SQL 过程已成功完成。 SQL> begin 2 DBMS_SCHEDULER.create_job( 3 job_name => 's_xifenfei_job', 4 program_name => 'x_program', 5 comments => 's_xifenfei_job', 6 repeat_interval => 'SYSTIMESTAMP + 1/1440', 7 auto_drop => false, 8 enabled => true); 9 end; 10 / PL/SQL 过程已成功完成。 SQL> select x_type,to_char(x_date,'yyyy-mm-dd hh24:mi:ss') from t_xifenfei; X_TYPE TO_CHAR(X_DATE,'YYY ---------- ------------------- job 2012-06-19 20:27:11 program 2012-06-19 20:27:09 program 2012-06-19 20:28:09 job 2012-06-19 20:28:11
这里可以看出来CREATE_PROGRAM是把CREATE_JOB中的部分参数给独立出来,使得更加灵活的控制,比如这里的使用从参数
3.CREATE_JOB结合CREATE_PROGRAM和CREATE_SCHEDULE
SQL> exec DBMS_SCHEDULER.drop_job('s_xifenfei_job'); PL/SQL 过程已成功完成。 SQL> truncate table t_xifenfei; 表被截断。 SQL> begin 2 DBMS_SCHEDULER.create_schedule( 3 repeat_interval => 'FREQ=MINUTELY;INTERVAL=1', 4 start_date => sysdate, 5 comments => 'xifenfei_sch', 6 schedule_name => 'X_SCH'); 7 end; 8 / PL/SQL 过程已成功完成。 SQL> begin 2 DBMS_SCHEDULER.create_job( 3 job_name => 't_xifenfei_job', 4 program_name => 'x_program', 5 comments => 't_xifenfei_job', 6 schedule_name => 'X_SCH', 7 auto_drop => false, 8 enabled => true); 9 end; 10 / PL/SQL 过程已成功完成。 SQL> select x_type,to_char(x_date,'yyyy-mm-dd hh24:mi:ss') from t_xifenfei; X_TYPE TO_CHAR(X_DATE,'YYY ---------- ------------------- job 2012-06-19 20:39:11 job 2012-06-19 20:37:11 job 2012-06-19 20:38:11 program 2012-06-19 20:39:01 program 2012-06-19 20:40:01
CREATE_SCHEDULE是把执行计划部分从CREATE_JOB独立处理,使得控制力度更大,更加灵活
补充说明:
1.还可以通过创建JOB_CLASS更加灵活的控制资源的使用情况,必须通过修改JOB_CLASS中的resource_consumer_group实现资源控制,service对应到数据库的service可以实现rac中在哪个节点执行等等
2.使用DBMS_SCHEDULER.set_attribute来修改相关属相如:
EXEC DBMS_SCHEDULER.set_attribute('GATHER_STATS_JOB','JOB_CLASS', 'AUTO_TASKS_JOB_CLASS2'); exec dbms_scheduler.set_attribute('WEEKNIGHT_WINDOW','REPEAT_INTERVAL','freq=daily; byday=MON,TUE,WED,THU,FRI;byhour=2;byminute=0;bysecond=0');