Oracle Database Scheduler整理

Oracle Database Scheduler整理

edit by :2018-7-4 15:28

10g引入的这个dbms_scheduler包,替代了之前的dbms_job包,该包功能更强大,可以将job需要的各种资源分开再进行组合。

使用dbms_scheduler创建一个定时任务有两种形式

1)创建1SCHEDULER来定义计划,1PROGRAM来定义任务内容,再创建1JOB,为这个JOB指定上面的SCHEDULERPROGRAM

2)直接创建JOB,在参数里面直接指定计划和任务内容。

1.  参考

http://www.cnblogs.com/lanzi/archive/2012/11/23/2784815.html

https://blog.csdn.net/cnham/article/details/5985172

https://blog.csdn.net/fw0124/article/details/6753715

2.  案例参考

2.1.  授予用户权限

要执行DBMS_SCHEDULER需要有CREATE JOB权限。

要创建外部操作系统命令的job, 还必须有CREATE EXTERNAL JOB权限。

要对于某个对象进行操作,必须是它的owner,或者对它具有alter权限,或者有create any job权限。

要创建/操作job_class,还需要有MANAGE SCHEDULER权限。job_class都是创建在sys schema中的。

create external job

create job

GRANT SCHEDULER_ADMIN TO scott;

GRANT CREATE JOB TO scott;

GRANT MANAGE SCHEDULER TO scott;

GRANT CREATE RULE, CREATE RULE SET, CREATE EVALUATION CONTEXT TO scott;

GRANT CREATE ANY RULE, CREATE ANY RULE SET,CREATE ANY EVALUATION CONTEXT TO scott;

2.2.  注意时间格式

在使用create_job或者create_schedule前,请先检查NLS_DATE_LANGUAGE, NLS_DATE_FORMAT, NLS_TIMESTAMP_FORMAT, NLS_TIMESTAMP_TZ_FORMAT等参数的值, 通过alter session 命令来修改。也可在使用中直接指定格式。例如

SQL>

select * from nls_session_parameters;

alter session set NLS_DATE_LANGUAGE='AMERICAN';

alter session set NLS_DATE_FORMAT='dd-mm-yyyy hh24:mi:ss';

alter session set NLS_TIMESTAMP_TZ_FORMAT='dd-mm-yyyy HH:MI:SS.FF AM TZR'

2.3.  使用定义好的存储过程

begin

dbms_scheduler.create_job(

job_name=> 'leo.UPDATE_STATS_JOB',

program_name=> 'leo.UPDATE_STATS_2',

start_date=>'2005-06-20 11:00.00.000000 PM +8:00',

repeat_interval=>'FREQ=MONTHLY;INTERVAL=1',

end_date=>'2006-06-20 11:00.00.000000 PM +8:00',

comments=>'Monthly statistics collection job');

end;

/

2.4.  指定外部命令执行

begin

dbms_scheduler.create_job(

job_name=> 'zip_emlog',

job_type=> 'EXECUTABLE',

job_action =>'/home/leo/zip_log.sh',

enabled=>true,

start_date=>'03-07-2005 9:30:00 PM + 8:00',

repeat_interval=>'FREQ=MINUTELY;INTERVAL=30',

end_date=>'31-07-2005 9:30:00 PM + 8:00',

comments=>'Get a latest em log copy and compress it every 30 minutes');

end;

/

2.5.  使用pl/sql

BEGIN

DBMS_SCHEDULER.CREATE_PROGRAM(

program_name => 'LEO.UPDATE_STATS',

program_type => 'PLSQL_BLOCK',

program_action => 'DECLARE sUsername varchar2(30);

cursor cur is select username from dba_users

where username not in ('SYS','SYSTEM','SYSMAN','DBSNMP')

and account_status='OPEN' and substr(username,1,5)<>'MGMT_' ;

BEGIN

OPEN cur;

FETCH cur into sUsername;

WHILE cur%Found

LOOP

DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);

FETCH cur into sUsername;

END LOOP;

close cur;

END;');

END;

/

上面这个例子创建一个名为"UPDATE_STATS"的程序,它的类型是PL/SQL 块,完成更新非系统用户的统计信息的工作。在这个基础上你可以定制一个合理的计划,来定期执行这个程序.

2.6.  使用programschedulerwindowsjob组合

---CREATE PROGRAM

BEGIN

  DBMS_SCHEDULER.CREATE_PROGRAM(program_name   => 'P_UPDATE_STATS',

                                program_type   => 'PLSQL_BLOCK',

                                program_action => 'DECLARE sUsername varchar2(30);

                                                    cursor cur is select username from dba_users

                                                    where username not in (''SYS'',''SYSTEM'',''SYSMAN'',''DBSNMP'') 

                                                    and account_status=''OPEN'';

                                                    BEGIN

                                                    OPEN cur;

                                                    FETCH cur into sUsername;

                                                    WHILE cur%Found

                                                    LOOP

                                                    DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);

                                                    FETCH cur into sUsername;

                                                    END LOOP;

                                                    close cur;

                                                    END;');

END;

/

BEGIN   DBMS_SCHEDULER.ENABLE(name   => 'P_UPDATE_STATS'); end;

SELECT * FROM DBA_SCHEDULER_PROGRAMS P where p.program_name='P_UPDATE_STATS';

---CREATE SCHEDULER

BEGIN

   dbms_scheduler.create_schedule(schedule_name   => 'SCH_EVERY_MORING',

                                  start_date=>systimestamp,

                                  --repeat_interval => 'FREQ=DAILY; INTERVAL=1;';

                                  repeat_interval => 'FREQ=HOURLY; INTERVAL=2');

                                  --end_date=>'31-07-2005 9:30:00 PM + 8:00'                           

END;

select * from dba_scheduler_schedules s where s.schedule_name='SCH_EVERY_MORING';

---CREATE WINDOWS

BEGIN

  dbms_scheduler.create_window(window_name     => 'EARLY_MORNING_WINDOW',

                               schedule_name   =>'SCH_EVERY_MORING',

                               duration        =>  numtodsinterval(1, 'hour'),

                               resource_plan   => 'DEFAULT_MAINTENANCE_PLAN');

end;

select * from dba_scheduler_windows w where w.window_name='EARLY_MORNING_WINDOW';

select * from dba_scheduler_window_details w where w.window_name='EARLY_MORNING_WINDOW';  

---CREATE JOB

BEGIN

   dbms_scheduler.create_job(job_name      => 'JOB_UPSTATS',

                             program_name  => 'P_UPDATE_STATS',

                             schedule_name => 'SCH_EVERY_MORING');

END;

select *from dba_scheduler_jobs j where j.job_name='JOB_UPSTATS';

select * from dba_scheduler_job_log j where j.job_name='JOB_UPSTATS';

2.7.  使用JOB直接创建

begin

  dbms_scheduler.create_job(job_name        => 'UP_STAT2',

                            job_type        => 'PLSQL_BLOCK',

                            JOB_ACTION      => 'DECLARE sUsername varchar2(30);

                                                    cursor cur is select username from dba_users

                                                    where username not in (''SYS'',''SYSTEM'',''SYSMAN'',''DBSNMP'') and account_status=''OPEN'';

                                                    BEGIN

                                                    OPEN cur;

                                                    FETCH cur into sUsername;

                                                    WHILE cur%Found

                                                    LOOP

                                                    DBMS_STATS.GATHER_SCHEMA_STATS (sUsername);

                                                    FETCH cur into sUsername;

                                                    END LOOP;

                                                    close cur;

                                                    END;',

                            start_date=>to_timestamp_tz('2018-07-04 00:00:00.000 +08:00','yyyy-mm-dd hh24:mi:ss.ff tzh:tzm'),

                            -- start_date      => '04-07-2018 02:30:00 PM +08:00',

                            repeat_interval => 'FREQ=DAILY; INTERVAL=1;',

                            enabled         => true);

END;

/

select * from dba_schedu

begin

  dbms_scheduler.enable(name => 'UP_STAT2');

END;

/

begin

  DBMS_SCHEDULER.DISABLE(name => 'UP_STAT2', force => true);

end;

/

select job_name,state from dba_scheduler_jobs where job_name='UP_STAT2';

SELECT to_char(log_date, 'DD-MON-YY HH24:MI:SS') TIMESTAMP,

       job_name,

       status,

       SUBSTR(additional_info, 1, 40) ADDITIONAL_INFO

  FROM user_scheduler_job_run_details s

  where s.job_name='UP_STAT2'

 ORDER BY log_date;

SELECT job_name, job_class, operation, status FROM USER_SCHEDULER_JOB_LOG where job_name='UP_STAT2';

2.8.  使用参数定义计划

BEGIN

      DBMS_SCHEDULER.CREATE_PROGRAM (

         program_name            => 'PRM_CREATEDUNDATA',

         program_action          => 'PKG_SCHEDULER.CREATEDUNDATA',

         program_type            => 'STORED_PROCEDURE',

         enabled                 => FALSE,

     number_of_arguments     => 5,

     comments            => '生成催缴数据'    

     );

  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PRM_CREATEDUNDATA',

                                         ARGUMENT_POSITION => 1,

                                         ARGUMENT_NAME     => 'I_BILLINGCYCLEID',

                                         ARGUMENT_TYPE     => 'VARCHAR2',

                                         DEFAULT_VALUE     => NULL,

                                         OUT_ARGUMENT      => FALSE);

                                        

  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PRM_CREATEDUNDATA',

                                         ARGUMENT_POSITION => 2,

                                         ARGUMENT_NAME     => 'I_BUSINESSTYPE',

                                         ARGUMENT_TYPE     => 'VARCHAR2',

                                         DEFAULT_VALUE     => NULL,

                                         OUT_ARGUMENT      => FALSE);

  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PRM_CREATEDUNDATA',

                                         ARGUMENT_POSITION => 3,

                                         ARGUMENT_NAME     => 'I_STATE',

                                         ARGUMENT_TYPE     => 'VARCHAR2',

                                         DEFAULT_VALUE     => NULL,

                                         OUT_ARGUMENT      => FALSE);

                                        

  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PRM_CREATEDUNDATA',

                                         ARGUMENT_POSITION => 4,

                                         ARGUMENT_NAME     => 'I_BANKCODE',

                                         ARGUMENT_TYPE     => 'VARCHAR2',

                                         DEFAULT_VALUE     => NULL,

                                         OUT_ARGUMENT      => FALSE);

  DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PRM_CREATEDUNDATA',

                                         ARGUMENT_POSITION => 5,

                                         ARGUMENT_NAME     => 'I_OPERATORCODE',

                                         ARGUMENT_TYPE     => 'VARCHAR2',

                                         DEFAULT_VALUE     => NULL,

                                         OUT_ARGUMENT      => FALSE);

  DBMS_SCHEDULER.ENABLE(NAME => 'PRM_CREATEDUNDATA');

  COMMIT;

END;

 之后就可以在select * from sys.USER_SCHEDULER_PROGRAMS t中看到program

3.  program

3.1.  create_program

参数说明:

  program_name——程序名称

  program_type——程序类型(STORED_PROCEDUREPLSQL_BLOCKEXECUTABLE

      STORED_PROCEDURE——ORACLE 中定义好的存储过程

      PLSQL_BLOCK——是一段标准的pl/sql 代码

      EXECUTABLE——指定外部命令的命令行信息(含路径信息)

program_type有三种形式

1)      -'PLSQL_BLOCK'

program_action是一个PL/SQL block. 不支持参数,number_of_arguments必须为0.必须以分号结尾。例如以下三种形式

'my_proc();'

'BEGIN my_proc(); END;'

'DECLARE arg pls_integer:= 10; BEGIN my_proc2(arg); END;'

2)      -'STORED_PROCEDURE'

program_action是一个存储过程,注意不支持INOUT or OUT参数,也不支持function.参数最多255个,可以通过SET_JOB_ARGUMENT_VALUE过程来设定。例如'"Schema"."Procedure"'.

3)      -'EXECUTABLE'

program_action是一个外部操作系统的命令行程序,包含完整路径,不能带任何命令行参数。开始的'?'会被替换为oracle home目录;'@'会被替换为当前oracle实例的SID

job_type类似于program_type,只是多了'CHAIN'这种类型来创建任务链。

  program_action——具体对应的执行内容,若为过程则为过程名

  number_of_arguments----

  enable——若为true则创建后激活反之不激活

  comments——注释

例子:

BEGIN

   dbms_scheduler.create_program(program_name        => 'myprogram',

                                 program_type        => 'STORED_PROCEDURE',

                                 program_action      => 'p_test1',

                                 number_of_arguments => 1,

                                 enabled             => FALSE,

                                 comments           => '更新gi_pipe');

   END;

注:如果创建的程序需要输入参数,则必须定义完参数后在激活,即创建这个program时将enable设为false,否则提示:Ora-27456:程序“ ”的参数并未全部定义;然后再对该program定义参数即执行define_program_argument过程(见1.3)。

--查看定义的program

SELECT * FROM user_scheduler_programs;

3.2.  drop_program

参数说明:

program_name——要删除的程序名称

force——true或者false。如果为true则不管该program是否被job引用都会删除,FALSE则若被引用无法删除,默认为false

例子:

BEGIN

   dbms_scheduler.drop_program(program_name => 'myprogram',force => TRUE);

END;

3.3.  define_program_argument

参数说明:

program_name——程序名称

argument_position——参数位置(也可以知道参数名称选择argument_name

argument_type——参数类型

default_value——参数默认值

例子:

BEGIN

   dbms_scheduler.define_program_argument(program_name      => 'myprogram',

                                          argument_position => 1,

                                          argument_name     => 'p_lttid',

                                          argument_type     => 'varchar2',

                                          default_value     => 'daaa');

END;

--查看定义的program参数   

SELECT *FROM User_Scheduler_Program_Args;

3.4.  define_anydata_argument

(用于定义输入参数为复杂类型需采用sys.AnyData类型来包装的参数)

参数说明:

program_name——程序名称

argument_position——参数位置(也可以知道参数名称选择argument_name

argument_type——参数类型为sys.AnyData

default_value——参数默认值

3.5.  define_metadata_argument

有效的metadata attributes: 'job_name', 'job_subname', 'job_owner', 'job_start', 'window_start',                              'window_end', and 'event_message'.

Metadata Attribute         Data Type                         Description

job_name                 VARCHAR2                        当前执行的job名称

job_subname              VARCHAR2                        当前执行的job子名称

job_owner                 VARCHAR2                        当前执行的job所有者

job_start                  TIMESTAMP WITH TIME ZONE        job启动的时间

window_start               TIMESTAMP WITH TIME ZONE       window打开的时间

window_end               TIMESTAMP WITH TIME ZONE       window关闭的时间

event_message                                              事件触发job启动的信息

例子:(以下metadata_attribute设置为job_name,即以job_start这个值作为输入参数)

BEGIN

   dbms_scheduler.define_metadata_argument(program_name       => 'myprogram',

                                           argument_position  => 1,

                                           argument_name      => 'p_lttid',

                                           metadata_attribute => 'job_start');

END;

 

3.6.  drop_program_argument

例子:

BEGIN

 dbms_scheduler.drop_program_argument(program_name =>'myprogram',                                        argument_position => 1);

END;

4.  schedule

4.1.  create_schedule

参数说明:

repeat_interval——运行频率

end_datecomments默认可以不填

例子:

BEGIN

   dbms_scheduler.create_schedule(schedule_name   => 'myscheduler',

                                  repeat_interval => 'FREQ=MINUTELY;INTERVAL=2');

END;

4.2.  repeat_interval常用例子

repeat_interval => 'FREQ=HOURLY; INTERVAL=2'

每隔2小时运行一次job

repeat_interval => 'FREQ=DAILY'

每天运行一次job

repeat_interval => 'FREQ=WEEKLY; BYDAY=MON,WED,FRI"

每周的1,3,5运行job

repeat_interval => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDAY=30'

每年的3,6,9,12月的30号运行job

a) 05/02 09/22 8:00 a.m., 1:00 p.m., 6:00 p.m.

'freq=daily;byhour=8,13,18;byminute=0;bysecond=0;bydate=0502,0922'

b) 每个月的最后一个工作日(注意,INTERVAL如果不指定,默认为1

'FREQ=MONTHLY;BYDAY=MON,TUE,WED,THU,FRI;BYSETPOS=-1'

c) 1/10开始的5天,即1/10~1/14

BYDATE=0110+SPAN:5D

+表示从指定日期开始;-表示到指定日期结束;

^表示围绕指定日期的n天,如果n为偶数,调整为n+1

d) 以下三种表示方法等同

BYDATE=0205-OFFSET:2W

BYDATE=0205-14D (the OFFSET: keyword is optional)

BYDATE=0122

4.3.  create_event_schedule

创建基于事件的调度,用于当一个特殊事件被抛出时启动一个job

Event类型       描述

job_started         job启动

job_succeeded     job启动成功

job_failed           job失败

job_broken        被禁止或状态改为broken

job_completed     job执行完成即完成了限制的最大执行次数或者到达执行指定的结束时间

job_stopped       停止job

job_sch_lim_reached 达到了scheduler的限制设置的值

job_disabled      禁止job

job_chain_stalled  A job running a chain was put into the CHAIN_STALLED state. A running chain becomes

 stalled if there are no steps running or scheduled to run and the chain evaluation_interval is set to NULL.

                  No progress will be made in the chain unless there is manual intervention.

job_all_events Not an event, but a constant that provides an easy way for you to enable all events

job_run_completed job执行或者失败或者成功或者被停止

参数:

event_condition——tab.user_data

queue_spec——必须先创建一个queuedbms_aqadm.create_queue

BEGIN

   dbms_scheduler.create_event_schedule(schedule_name       => 'acc_mgr_change',

                                     start_date        => systimestamp,

                                     event_condition=>'tab.user_data.event_name= ''acc_mgr_change''',

                                     queue_spec      => 'proc_queue');

end;

4.4.  drop_schedule

例子:

BEGIN

  DBMS_SCHEDULER.drop_schedule(schedule_name => 'myscheduler');

END;

5.  job

5.1.  create_job

参数说明:

job_type     类同上述创建program

job_class       DEFAULT 'DEFAULT_JOB_CLASS'

enabled       默认FALSE,其创建后要想执行该job必须先执行enable过程

auto_drop     默认TRUE,即当job执行完毕都到期是否直接删除job

comments    默认NULL

job_style       默认REGULAR

credential_name 默认 NULL

destination_name 默认 NULL

--不采用programscheduler直接创建job

BEGIN

   dbms_scheduler.create_job(job_name        => 'myjob',

                             job_type        => 'STORED_PROCEDURE',

                             job_action      => 'p_test1',

                             start_date      => '',

                             repeat_interval => 'FREQ=DAILY;INTERVAL=2',

                             enabled         => TRUE,

                             comments        => 'My new job');

END;

--根据programscheduler创建job

BEGIN

   dbms_scheduler.create_job(job_name      => 'myjob',

                             program_name  => 'myprogram',

                             schedule_name => 'myscheduler');

END;

5.2.  run_job

BEGIN

   dbms_scheduler.run_job(job_name => 'myjob2');

END;

5.3.  stop_job

BEGIN dbms_scheduler.stop_job(job_name => 'myjob');END;

5.4.  copy_job

BEGIN dbms_scheduler.copy_job(old_job =>'myjob' ,new_job =>'myjob2' );END;

5.5.  drop_job

BEGIN dbms_scheduler.drop_job(job_name => 'myjob');END;

5.6.  set_job_argument_value

设置job的输入参数值,设置后会覆盖原先定义该参数设置的默认值

BEGIN

   dbms_scheduler.set_job_argument_value(job_name          => 'myjob2',

                                         argument_position => 1,

                                         argument_value    => 'qwerer');

END;

5.7.  set_job_anydata_value

方法类似set_job_argument_value,只是设置的参数值类似是sys.anydata

5.8.  reset_job_argument_value

重置job参数值,将其置为空

6.  group11g才有的)

6.1.  create_group

参数:

group_type——组类型,该组的所有成员必须是同一类型,已有的类型有三种:

1)      DB_DEST:即成员为目标数据库,执行远程数据库的job

2)      EXTERNAL_DESTExternal destination):Members are external destinations, for running remote external jobs

3)      WINDOWMembers are Scheduler windows

创建时可以指定成员也可不指定,添加成员通过add_group_member过程添加。

BEGIN

   dbms_scheduler.create_group(group_name =>,

                               group_type =>,

                               MEMBER =>,

                               comments =>);END;

6.2.  drop_group

删除组

6.3.  add_group_member

为组添加成员

6.4.  remove_group_member

移除组成员

6.5.  create_database_destination

创建目标数据库,用于执行远程job

AGENT——The external destination name of the Scheduler agent to connect. Equivalent to an agent name.

       The external destination must already exist. The external destination representing an agent is

       created automatically on a database instance when the agent registers with that instance.

       An agent‘s name is specified in its agent configuration file. If it is not specified, it defaults

       to the first part (before the first period) of the name of the host it resides on.

DBMS_SCHEDULER.CREATE_DATABASE_DESTINATION (

   destination_name        IN VARCHAR2,--目标数据库名称

   agent                   IN VARCHAR2,--代理名称,事先创建好的

   tns_name                IN VARCHAR2,--tns名称

   comments                IN VARCHAR2 DEFAULT NULL);

6.6.  drop_database_destination

6.7.  drop_agent_destination

7.  job class

Job Classes 相当于创建了一个job组,DBA可以将那些具有相同特性的job,放到相同的Job Classes中,

然后通过对Job Class应用ORACLE中的"资源使用计划"特性,就可以对这些job执行过程中所需要的资源分配情况进行管理。

7.1.  create_job_class

参数:

resource_consumer_group——指定该jobclass所使用的资源分配方式。具体创建方法见dbms_resource_manager.create_consumer_group

1)      jobclassresource_consumer_group为多对1关系;

2)      若为该jobclass指定的resource_consumer_group被删除,则使用默认的resource_consumer_group

3)      若没为jobclass指定具体的resource_consumer_group,则使用默认的resource_consumer_group

4)      若为该jobclass指定的resource_consumer_group不存在,则会提示错误;

5)      若为该jobclass指定了resource_consumer_group,则service参数必须设置为空(即这两个参数只能设置其中一个)。

service——一般用于rac环境指定jobclass运行于哪个节点。

logging_level——日志记录级别(DBMS_SCHEDULER.LOGGING_OFFDBMS_SCHEDULER.LOGGING_RUNSDBMS_SCHEDULER.LOGGING_FULL

log_history——日志存放时间,默认30

例子:

BEGIN

   dbms_scheduler.create_job_class(job_class_name          =>,

                                   resource_consumer_group =>,

                                   service                 =>,

                                   logging_level           =>,

                                   log_history             =>,

                                   comments                =>);

END;

7.2.  drop_job_class

--删除多个job class用逗号隔开

BEGIN

   dbms_scheduler.drop_job_class(job_class_name => '');

END;

8.  window

通常job启动后,用户只能被动地等待其执行,一直到其执行地任务完成(DBA手动kill对应进程),在此期间,执行的job将与其它活动的进程共同竞争当前系统中的资源。在9i之前就是这样。在Job Classes中也可以控制job能够使用的资源,不过单单使用Job Classes并不能灵活的控制job在合适的时间使用适当的资源。进入10g之后,采用dbms_schedulerWINDOW可以缓解该问题。WINDOW 可以指定一个时间窗口,在此期间,通过与Job Classes的搭配组合,能够有效控制job执行时支配(使用)的资源。比如说job通常是在凌晨服务器负载较低时执行,那么就可以通过WINDOW设置在此期间,允许jobs使用更多的系统资源,而到了工作时间后,如果job仍未执行完成,为其分配另一个有限的资源,以尽可能降低job执行占用的资源对其它业务的影响。

8.1.  create_window

参数:

resource_plan——资源计划,即通过 dbms_resource_manager.create_plan来创建。

schedule_name——调度名称,基于已经创建好的调度创建window

duration——时间窗口打开后持续的时间,创建时必须设置该值,因为没有默认值,设置范围从1分钟到99天。

window_priority——window优先级,如果同一时间出现多个window时则根据优先级决定执行哪个。

--创建一个基于调度的window

BEGIN

   dbms_scheduler.create_window(window_name     =>,

                                resource_plan   =>,

                                schedule_name   =>,

                                duration        =>,

                                window_priority =>,

                                comments        =>);

END;

--不基于时间调度创建window

DBMS_SCHEDULER.CREATE_WINDOW (

   window_name             IN VARCHAR2,

   resource_plan           IN VARCHAR2,

   start_date              IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,

   repeat_interval         IN VARCHAR2,

   end_date                IN TIMESTAMP WITH TIME ZONE DEFAULT NULL,

   duration                IN INTERVAL DAY TO SECOND,

   window_priority         IN VARCHAR2                 DEFAULT 'LOW',

   comments                IN VARCHAR2                 DEFAULT NULL);

8.2.  drop_window

删除一个window

8.3.  open_window

打开一个window

8.4.  close_window

关闭一个window

9.  window group

一个WINDOW GROUP可能包含多个WINDOW。使用WINDOW GROUP的本意是这样的,假如说某个job执行的时间比较长,甚至全天24小时都在执行,对于这类job,单个WINDOW很难有效调整其资源占用,因此就可以通过设置一个WINDOW GROUP,该WINDOW GROUP中包含了多个WINDOW,每个WINDOW分别负责不同时间点时的资源使用计划。然后在创建JOB时,指定schedule_name参数为WINDOW GROUP的名称,当然也可以直接指定window名称(window已经包含了调度信息了)。

9.1.  create_window_group

BEGIN

   dbms_scheduler.create_window_group(group_name  =>,

                                      window_list =>,

                                      comments    =>);

END;

9.2.  add_window_group_member

增加一个window

BEGIN

   dbms_scheduler.add_window_group_member(group_name => ,window_list => );

END;

9.3.  remove_window_group_member

移除一个window

9.4.  drop_window_group

删除一个window

10.      chain

CHAIN可以被视做多个program放到同一个链中,这样的话就可以指定这些program执行的先后顺序。

10.1.    create_chain

DBMS_SCHEDULER.CREATE_CHAIN (

   chain_name              IN VARCHAR2,

   rule_set_name           IN VARCHAR2 DEFAULT NULL,

   evaluation_interval     IN INTERVAL DAY TO SECOND DEFAULT NULL,

   comments                IN VARCHAR2 DEFAULT NULL);

10.2.    define_chain_rule

定义规则

举例,如my_step1执行完则执行my_step2,若my_step2执行完则结束

BEGIN

   dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',

                                    condition  => 'TRUE',

                                    action     => 'start my_step1',

                                    rule_name  => 'my_rule1');

   dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',

                                    condition  => 'my_step1 completed',

                                    action     => 'start my_step2',

                                    rule_name  => 'my_rule2');

   dbms_scheduler.define_chain_rule(chain_name => 'my_chain1',

                                    condition  => 'my_step2 completed',

                                    action     => 'end 0',

                                    rule_name  => 'my_rule3');

END;

10.3.    define_chain_step

 BEGIN

    dbms_scheduler.define_chain_step(chain_name   => 'my_chain1',

                                     step_name    => 'my_step1',

                                     program_name => 'p_p2');

    dbms_scheduler.define_chain_step(chain_name   => 'my_chain1',

                                     step_name    => 'my_step2',

                                     program_name => 'p_p3');

 END;

10.4.    define_chain_event_step

BEGIN

   dbms_scheduler.define_chain_event_step(chain_name          =>,

                                          step_name           =>,

                                          event_schedule_name =>,

                                          timeout             =>);

END;

10.5.    drop_chain_rule

dbms_scheduler.drop_chain_rule(chain_name => ,rule_name => );

10.6.    drop_chain_step

dbms_scheduler.drop_chain_step(chain_name => ,step_name => );

10.7.    alter_chain

dbms_scheduler.alter_chain(chain_name => ,step_name => ,attribute => ,value => );

10.8.    drop_chain

10.9.    analyze_chain

dbms_scheduler.analyze_chain(chain_name => ,rules => ,steps => ,step_pairs => );

10.10. alter_running_chain

dbms_scheduler.alter_running_chain(job_name => ,step_name => ,attribute => ,value => );

10.11. evaluate_running_chain

dbms_scheduler.evaluate_running_chain(job_name => );

10.12. run_chain

dbms_scheduler.run_chain(chain_name => ,start_steps => ,job_name => );

11.      credential

创建用户名密码,用于认证job执行

11.1.    create_credential

BEGIN

   dbms_scheduler.create_credential(credential_name =>,

                                    username        =>,

                                    password        =>,

                                    database_role   =>,

                                    windows_domain  =>,

                                    comments        =>);

END;

11.2.    drop_credential

11.3.    put_file

BEGIN

   dbms_scheduler.put_file(destination_file        =>,

                           destination_host        =>,

                           credential_name         =>,

                           file_contents           =>,

                           destination_permissions =>);

END;

11.4.    get_file

11.5.    create_file_watcher

BEGIN

   dbms_scheduler.create_file_watcher(file_watcher_name     =>,

                                      directory_path        =>,

                                      file_name             =>,

                                      credential_name       =>,

                                      destination           =>,

                                      min_file_size         =>,

                                      steady_state_duration =>,

                                      comments              =>,

                                      enabled               =>);

END;

11.6.    drop_file_watcher

11.7.    add_job_email_notification

BEGIN

   dbms_scheduler.add_job_email_notification(job_name         =>,

                                             recipients       =>,

                                             sender           =>,

                                             subject          =>,

                                             BODY             =>,

                                             events           =>,

                                             filter_condition =>);

END;

11.8.    remove_job_email_notification

12.      通用属性

12.1.    DISABLE

BEGIN  dbms_scheduler.disable(NAME => 'myjob2');END;

12.2.    enable

BEGIN  dbms_scheduler.enable(NAME => 'myprogram'); END;

BEGIN  dbms_scheduler.enable(NAME => 'myjob2'); END;

如果为TRUE, 创建时候检查program/job有效性,如果通过检查把program/job置为ENABLED.

program/job使用前必须通过ENABLE过程把它置为ENABLED

如果programdisabled,仅仅enable一个job,那么job会按计划执行,但是会失败。

12.3.    auto_drop

如果为TRUE, job完成之后或者被自动disabled之后job将被自动删除。

如果满足以下条件,job被视为完成。

a) 过了end_date

b) 达到了最大运行次数(max_runs,可以通过SET_ATTRIBUTE来指定)

c) 非重复任务,即只运行一次的任务,并且已经运行了1次。

如果满足以下条件,job被视为自动disabled.

a) 达到了最大运行失败次数(max_failures,可以通过SET_ATTRIBUTE来指定)

12.4.    set_attribute

attribute:是指设置job的属性,属性有:

1)      logging_level——记录的日志信息,有三个值(DBMS_SCHEDULER.LOGGING_OFFDBMS_SCHEDULER.LOGGING_RUNSDBMS_SCHEDULER.LOGGING_FULL

2)      restartable——设置job失败是否要重启

3)      max_failures——允许job失败的次数,范围11000000,默认为空。

4)      max_runs——job执行的最大次数,范围11000000,默认为空(即意味着job会重复执行,或者到达job执行的end_date,或者达到指定失败的次数)。一旦达到设置的最大值,job将会disable并且状态变更为COMPLETED

5)      max_run_duration——设置job运行的有效时间,如果设置了某个值,则在到达该值时调度会报JOB_OVER_MAX_DUR事件,然后由事件处理器决定是否要继续。

6)      instance_stickiness——只用于rac数据库。默认为true,设置为true,则job会运行在负载最轻的节点上;如果某节点关闭或负载太重,则不会启动新job,而是有另一个节点来执行该job

7)      stop_on_window_close——window关闭的时候停止job,默认为false。因此默认情况下关闭了windowjob还是会继续执行,但是要注意,window关闭则意味着资源使用计划就会变化。

8)      job_priority——在同一个classjob执行的优先级,默认为3.

9)      schedule_limit——允许启动job延迟的时间,设置值从1分钟到99天。超过了延迟的时间则不再启动job。如果不设置该值,则只要得到允许所需的资源就会启动。另外,在延迟的这段时间里,job的执行次数或失败次数                会跳过,不计算这段时间的。

10)   program_name——job执行的对象。如果设置了该属性,则job_action, job_typenumber_of_arguments要设置为空。

11)   job_action——job执行对象内容

12)   job_type——job执行对象类型('PLSQL_BLOCK', 'STORED_PROCEDURE', 'EXECUTABLE', and 'CHAIN')。如果设置了该值,那么program_name参数必须设置为空 。

13)   number_of_arguments——参数个数。如果设置了该值,那么program_name参数必须设置为空。

14)   schedule_name——调度名,如果设置了该值,则end_date, start_date and repeat_interval需设置为空。

15)   repeat_interval——执行间隔,设置了该值,则schedule_name需为空。

16)   start_date——执行开始时间,设置了该值,则schedule_name需为空。

17)   end_date——不再执行job的时间,设置了该值,则schedule_name需为空。

18)   job_class——jobclass

19)   comments——备注

20)   auto_drop——job状态为completed则自动删除该job

21)   event_spec——需含两个值(event conditionqueue specification

22)   raise_events——设置当job为什么状态时抛出,具体的时间类型见event类型。

23)   log_history-----设置log_history90天,默认30天;BEGIN    dbms_scheduler.set_scheduler_attribute('log_history', '90');END;

12.5.    start_date

实际上是schedule生效的日期,

对于一个定时执行的schedule,实际上的开始日期取决于repeat_interval参数。

如果start_datenull,等同于jobenable的时刻。

Oraclestart_date来作为repeat_intervaldefault值。

例如,如果指定start_date1/31/2010 9:45:58,指定repeat_interval'FREQ=YEARLY'

等同于'freq=yearly;bymonth=1;bymonthday=31;byhour=9;byminute=45;bysecond=58'

不能给repeat_interval指定时区信息,Oraclestart_date的时区信息作为指定的时区。

12.6.    set_attribute_null

12.7.    get_attribute

13.      scheduler attribute

设置调度属性的值

13.1.    set_scheduler_attribute

attribute类型有:default_timezoneemail_serveremail_senderemail_server_credentialemail_server_encryption                event_expiry_time log_historymax_job_slave_processes(没使用)

BEGIN

   dbms_scheduler.set_scheduler_attribute(attribute => ,value => );

END;

13.2.    get_scheduler_attribute

BEGIN

   dbms_scheduler.get_scheduler_attribute(attribute => ,value => );

END;

13.3.    add_event_queue_subscriber

BEGIN

   dbms_scheduler.add_event_queue_subscriber(subscriber_name => );

END;

13.4.    remove_event_queue_subscriber

BEGIN

   dbms_scheduler.remove_event_queue_subscriber(subscriber_name => );

END;

13.5.    purge_log

BEGIN

   dbms_scheduler.purge_log(log_history => ,which_log => ,job_name => );

END;

14.      dbms_scheduler包一些视图

--*代表alldbauser

14.1.    查看job的视图

*_scheduler_jobs --查看job

*_scheduler_job_args  --查看job的所有输入参数

*_scheduler_job_classes --查看job的类信息

*_scheduler_job_dests --查看job状态

*_scheduler_job_log --查看job日志

*_scheduler_job_run_details --查看job执行的详细信息

all_scheduler_running_jobs

14.2.    查看chain的一些视图

*_scheduler_chains

*_scheduler_chain_rules

*_scheduler_chain_steps

*_scheduler_running_chains --查看正在执行的chains

14.3.    查看program的视图

*_scheduler_programs --查看程序

*_scheduler_program_args --查看程序参数

14.4.    查看调度组信息

*_scheduler_groups

*_scheduler_group_members

14.5.    查看window的视图

(这类视图只有dbaall开头的)

*_scheduler_windows --查看window

*_scheduler_window_details --查看window详细信息

*_scheduler_window_groups --查看window

*_scheduler_window_log --查看window日志

*_scheduler_wingroup_members ----查看window成员

14.6.    查看scheduler视图

*_scheduler_schedules --查看调度

*_scheduler_global_attribute --显示所有的调度属性

*_scheduler_credentials

*_scheduler_db_dests

*_scheduler_dests

*_scheduler_external_dests

*_scheduler_file_watchers

*_scheduler_notifications

*_scheduler_remote_databases

*_scheduler_remote_jobstate

14.7.    检验后续运行时间

dbms_scheduler提供了一个过程可以很方便的检验指定的计划(repeat_interval)

DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING (

   calendar_string    IN  VARCHAR2,

   start_date         IN  TIMESTAMP WITH TIME ZONE,

   return_date_after  IN  TIMESTAMP WITH TIME ZONE,

   next_run_date      OUT TIMESTAMP WITH TIME ZONE);

下面创建一个过程evaluate_repeat_interval

传入repeat_interval字符串和计算的次数,会把每次的执行时间打印出来。

create or replace procedure evaluate_repeat_interval(

  p_repeat_interval in varchar2,

  p_number_of_evaluation in int,

  p_start_date in timestamp with time zone default sysdate

)

as

  l_return_date_after timestamp with time zone;

  l_next_run_date  timestamp with time zone;

begin

  l_return_date_after := p_start_date;

  for i in 1..p_number_of_evaluation loop

    dbms_scheduler.evaluate_calendar_string(

      calendar_string=>p_repeat_interval,

      start_date=>p_start_date,

      return_date_after=>l_return_date_after,

      next_run_date=>l_next_run_date);

    dbms_output.put_line(l_next_run_date);

    l_return_date_after := l_next_run_date;

  end loop;

end;

 

--调用的例子1:每个月的最后一天

begin

evaluate_repeat_interval(

  p_repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=-1',

  p_number_of_evaluation=>3,

  p_start_date=>to_timestamp_tz('2012-01-01 00:00:00.000 +08:00',

    'yyyy-mm-dd hh24:mi:ss.ff tzh:tzm'));

end;

--执行结果


请使用浏览器的分享功能分享到微信等