• 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;





  • 相关阅读:
    oracle中文乱码问题
    并发登录查询
    AJAX 笔记
    jQuery笔记
    js BOM 笔记
    HTML DOM笔记
    JS函数笔记
    js笔记
    json笔记
    css3笔记
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2999628.html
Copyright © 2020-2023  润新知