oracle 判断日期是否是工作日_详解Oracle定时任务机制-DBMS_SCHEDULER

概述

关于Oracle定时任务管理一般有两个方式,前面已经介绍了DBMS_JOB这种方式,今天主要介绍下另外一种管理方式:DBMS_SCHEDULE。


DBMS_SCHEDULE

Oracle 10g之前,可以使用dbms_job来管理定时任务。10g之后,Oracle引入dbms_scheduler来替代先前的dbms_job,

在功能方面,它比dbms_job提供了更强大的功能和更灵活的机制/管理。

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

1)创建1个SCHEDULER来定义计划

1个PROGRAM来定义任务内容,再创建1个JOB,为这个JOB指定上面的SCHEDULER和PROGRAM。

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

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

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

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

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

915960a1f1d7cfb30f630cb41c03252b.png
996a464ce40d629d2d59c495a1ea83e9.png
2f661be17a7406dd9a3fe0edf914e9f7.png
ca281f6f363ac64e3636a2f0883d9a72.png

参数说明

1)schedule_name,program_name,job_name

这些名字在整个sql名字空间内必须唯一。比如,job_name不能和某个表名相同。

2)repeat_interval

定义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:2WBYDATE=0205-14D (the OFFSET: keyword is optional)BYDATE=0122

3)start_date

实际上是schedule生效的日期,

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

如果start_date为null,等同于job被enable的时刻。

Oracle取start_date来作为repeat_interval的default值。

4)end_date

这个时间之后,job将不再被执行。

5)program_type/program_action/number_of_arguments/job_type/job_action

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

program_action是一个存储过程,注意不支持INOUT or OUT参数,也不支持function.

参数最多255个,可以通过SET_JOB_ARGUMENT_VALUE过程来设定。

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

6) enabled

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

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

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

7)auto_drop

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

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

a) 过了end_date。

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

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

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

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

相关数据字典

1) dba_scheduler_jobs/user_scheduler_jobsEnabling 一个 disabled 状态的job会重设本视图中的RUN_COUNT, FAILURE_COUNT and RETRY_COUNT.2) dba_scheduler_programs/user_scheduler_programs3) dba_scheduler_schedules/user_scheduler_schedules4) dba_scheduler_job_log/dba_scheduler_job_run_details5) dba_scheduler_job_classes6) 默认情况下,数据库自身定义了一个PURGE_JOB的任务。

该任务每天凌晨3点钟启动,清除30天前所产生的任务日志。


这块还是需要重点掌握的,概念东西做个理解就行,后面会再整理了下涉及的一些命令,感兴趣的朋友可以关注一下~

8b08e164f3f3cb245444a8e13d3cfcd4.gif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值