DBMS_SCHEDULER 的使用

1.通过DBMS_SCHEDULER.CREATE_JOB直接创建job

 

CREATE TABLE T_ROSANU

(

  R_ID   VARCHAR2(10),

  R_DATE TIMESTAMP(6)

);

--表已创建。

BEGIN

  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'job_create_rosanu',

                            JOB_TYPE        => 'PLSQL_BLOCK',

                            JOB_ACTION      => 'BEGIN

                                                  INSERT INTO T_ROSANU VALUES ('' job '', SYSDATE);

                                                  COMMIT;

                                                END;',

                            ENABLED         => TRUE,

                            START_DATE      => SYSTIMESTAMP,

                            REPEAT_INTERVAL => 'SYSTIMESTAMP + 1/1440',

                            COMMENTS        => 'rosanu_create_job');

END;

--PL/SQL 过程已成功完成。

SELECT R_ID, TO_CHAR(R_DATE, 'yyyy-mm-dd hh24:mi:ss') FROM T_ROSANU;

/*

R_ID     TO_CHAR(R_DATE,'yyyy-mm-dd hh24:mi:ss)

-----------------------------------------------

job        2013-03-29 18:12:11

job        2013-03-29 18:13:11

job        2013-03-29 18:14:11

*/

这里的使用方法和dbms_jobs差不多,不过这个提供了加灵活的使用方法,比如可以执行匿名块和执行操作系统命令等;
2.CREATE_JOB结合CREATE_PROGRAM

 

 

CREATE OR REPLACE PROCEDURE PROC_ROSANU(IN_ID IN VARCHAR2) IS

BEGIN

  INSERT INTO T_ROSANU VALUES (IN_ID, SYSDATE);

  COMMIT;

END;

-- 过程已创建。



-- 创建Program 

BEGIN

  DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME        => 'program_rosanu',

                                PROGRAM_ACTION      => 'PROC_ROSANU',

                                PROGRAM_TYPE        => 'STORED_PROCEDURE',

                                NUMBER_OF_ARGUMENTS => 1,

                                COMMENTS            => 'Rosanu_PROGRAM',

                                ENABLED             => FALSE);

END;

-- PL/SQL 过程已成功完成。



--设置Program参数

BEGIN

  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'program_rosanu',

                                         ARGUMENT_POSITION => 1,

                                         ARGUMENT_TYPE     => 'VARCHAR2',

                                         DEFAULT_VALUE     => 'program');

END;

-- PL/SQL 过程已成功完成。 



--执行Program

EXEC DBMS_SCHEDULER.ENABLE('program_rosanu');

-- PL/SQL 过程已成功完成。 



-- 创建Job

BEGIN

  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME        => 'job_rosanu',

                            PROGRAM_NAME    => 'program_rosanu',

                            COMMENTS        => 'rosanu_create_job',

                            REPEAT_INTERVAL => 'SYSTIMESTAMP + 1/1440',

                            AUTO_DROP       => FALSE,

                            ENABLED         => TRUE);

END;

--  PL/SQL 过程已成功完成。



SELECT R_ID, TO_CHAR(R_DATE, 'yyyy-mm-dd hh24:mi:ss') FROM T_ROSANU;



/*

R_ID     TO_CHAR(R_DATE,'yyyy-mm-dd hh24:mi:ss')

------------------------------------------------

job        2013-02-29 20:20:11

program    2013-02-29 20:20:09

program    2013-02-29 20:21:09

job        2013-02-29 20:21:11

*/

从这里使用的参数可以看出CREATE_PROGRAM把CREATE_JOB中的部分参数给独立出来,使得更加灵活的控制;

 

3.CREATE_JOB结合CREATE_PROGRAM和CREATE_SCHEDULE

 

exec DBMS_SCHEDULER.drop_job('job_create_rosanu'); 

--PL/SQL 过程已成功完成。 

truncate table t_rosanu; 

--表被截断。 

BEGIN

  DBMS_SCHEDULER.CREATE_SCHEDULE(REPEAT_INTERVAL => 'FREQ=MINUTELY;INTERVAL=1',

                                 START_DATE      => SYSDATE,

                                 COMMENTS        => 'rosanu_create_job',

                                 SCHEDULE_NAME   => 'SCHEDULE_ROSANU');

END;

-- PL/SQL 过程已成功完成。

 

BEGIN

  DBMS_SCHEDULER.CREATE_JOB(JOB_NAME      => 't_xifenfei_job',

                            PROGRAM_NAME  => 'program_rosanu',

                            COMMENTS      => 'rosanu_create_job',

                            SCHEDULE_NAME => 'SCHEDULE_ROSANU',

                            AUTO_DROP     => FALSE,

                            ENABLED       => TRUE);

END;

-- PL/SQL 过程已成功完成。

                           

SELECT R_ID, TO_CHAR(R_DATE, 'yyyy-mm-dd hh24:mi:ss') FROM T_ROSANU;

/*

R_ID     TO_CHAR(R_DATE,'yyyy-mm-dd hh24:mi:ss')

---------- --------------------------------------

job        2013-03-29 21:39:11

job        2013-03-29 21:37:11

job        2013-03-29 21:38:11

program    2013-03-29 21:39:01

program    2013-03-29 21: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');
--DBMS_SCHEDULER 运行信息

SELECT JOB_NAME,

       STATE,

       ENABLED,

       TO_CHAR(LAST_START_DATE, 'yyyy-mm-dd hh24:mi:ss'),

       SCHEDULE_NAME

  FROM DBA_SCHEDULER_JOBS;

--DBMS_SCHEDULER运行成功与否信息

SELECT LOG_ID,

       JOB_NAME,

       STATUS,

       TO_CHAR(ACTUAL_START_DATE, 'yyyy-mm-dd HH24:MI:ss') START_DATE,

       TO_CHAR(LOG_DATE, 'yyyy-mm-dd HH24:MI:ss') LOG_DATE

  FROM DBA_SCHEDULER_JOB_RUN_DETAILS

 WHERE JOB_NAME = 'JOB_ROSANU'

 ORDER BY 4 DESC;

--查询执行时间情况

SELECT T1.WINDOW_NAME, T1.REPEAT_INTERVAL, T1.DURATION

  FROM DBA_SCHEDULER_WINDOWS T1, DBA_SCHEDULER_WINGROUP_MEMBERS T2

 WHERE T1.WINDOW_NAME = T2.WINDOW_NAME

   AND T2.WINDOW_GROUP_NAME = 'MAINTENANCE_WINDOW_GROUP';

--修改执行时间

BEGINDBMS_SCHEDULER.SET_ATTRIBUTE('WEEKEND_WINDOW',

                                  'REPEAT_INTERVAL',

                                  'freq=daily;byday=SAT;byhour=0;byminute=0;bysecond=0');

DBMS_SCHEDULER.SET_ATTRIBUTE('WEEKEND_WINDOW', 'DURATION', '+002 00:00:00');

END;




 


 

你可能感兴趣的:(scheduler)