sys.dbms_scheduler.create_job创建定时任务(功能更强大丰富)

本文详细介绍了如何在Oracle中使用DBMS_SCHEDULER创建和删除作业(job),并重点解析了repeat_interval参数的设置,包括各种时间周期的指定,如每日、每周、每月和每年的定时任务。此外,还提供了evaluate_calendar_string过程的使用,用于评估job的运行时间和下次运行时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

job的创建与删除

JOB中的定时频率repeat_interval详解


job的创建与删除

begin
  sys.dbms_scheduler.create_job(job_name            => 'GIS.TEST_JOB',
                                job_type            => 'STORED_PROCEDURE',
                                job_action          => 'pc_test',
                                start_date          => to_date('06-08-2019 9:10:00', 'dd-mm-yyyy hh24:mi:ss'),
                                repeat_interval     => 'Freq=MINUTELY;Interval=5',
                                end_date            => to_date(null),
                                job_class           => 'DEFAULT_JOB_CLASS',
                                enabled             => true,
                                auto_drop           => false,
                                comments            => '测试存储过程');
end;
/

说明:

 
1、job_name: 任务名称
2、job_type:有三种类型,PL/SQL Block、Stored procedure、Executable
3、job_action:根据job_type的不同,有不同的含义
如果job_type指定的是存储过程,就需要指定存储过程的名字;
如果job_type指定的是PL/SQL块,就需要输入完整的PL/SQL代码;
如果job_type指定的外部程序,就需要输入script的名称或者操作系统的指令名
4、start_date:开始时间
5、repeat_interval:运行的时间间隔,上面例子是每天23点运行一次
6、end_date:到期时间
7、enabled:创建后自动激活
8、auto_drop:默认true,即当job执行完毕都到期是否直接删除job
9、comments:备注

数据循环周期设置与实例:

1.每周5的时候运行,以下3条实现功能一样
REPEAT_INTERVAL => 'FREQ=DAILY; BYDAY=FRI';   
REPEAT_INTERVAL => 'FREQ=WEEKLY; BYDAY=FRI';   
REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=FRI'; 
 
2.每隔一周运行一次,仅在周5运行
REPEAT_INTERVAL => 'FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI’;  
 
3.每月最后一天运行
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=-1'; 
 
4.在3月10日运行
REPEAT_INTERVAL => 'FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10’; 
REPEAT_INTERVAL => 'FREQ=YEARLY; BYDATE=0310'; 
 
5.每10隔天运行
REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10’; 
 
6.每天的下午4、5、6点时运行
REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=16,17,18’;
 
7.每月29日运行
REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=29’; 
 
8.每年的最后一个周5运行
REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=-1FRI’; 
 
9.每隔50个小时运行
REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=50’;  
--删除job

begin

 dbms_scheduler.drop_job('xxxx');

end;

--禁用

begin

 dbms_scheduler.disable('xxxx');

end;

--启动

begin

 dbms_scheduler.enable('xxxx');

end;

exec dbms_scheduler.enable('demo_job');  --启用jobs  
 
exec dbms_scheduler.disable('demo_job');  --禁用jobs 

exec dbms_scheduler.run_job('demo_job');  --执行jobs  
 
exec dbms_scheduler.stop_job('demo_job');  --停止jobs  

exec dbms_scheduler.drop_job('demo_job');  --删除jobs 



user_scheduler_jobs 查看所有job信息

user_scheduler_running_jobs 查看所有正在运行的job

user_scheduler_job_run_details job运行日志

User_Scheduler_Job_Log job job日志




JOB中的定时频率repeat_interval详解

REPEAT_INTERVAL结构为:REPEAT_INTERVAL => 'Freq=Minutely;Interval=5'

FREQ 关键字用来指定间隔的时间周期,可选参数有:YEARLY(年), MONTHLY(月), WEEKLY(周), DAILY(日), HOURLY(时), MINUTELY(分), SECONDLY(秒)等单位。

INTERVAL 关键字用来指定间隔的频繁,

可指定的值的范围从1-999。

BYHOUR  指定一天中的小时。

可指定的值的范围从1-24。16,17,18就表示每天下午的4、5、6点。

BYDAY 关键字用来指定每周的哪天运行。

“MON” | “TUE” | “WED” | “THU” | “FRI” | “SAT” | “SUN”

BYMONTHDAY 关键字用来指定每月中的哪一天。

1,2,3...随便哪一天,-1 表示每月最后一天。

BYMONTH  关键字用来指定每年的月份。

“JAN” | “FEB” | “MAR” | “APR” | “MAY” | “JUN” | “JUL” | “AUG” | “SEP” | “OCT” | “NOV” | “DEC”

BYDATE 指定日期。

0310就表示3月10日。

例如:

运行每星期五。(所有这三个例子是等价的。)

  1. FREQ=DAILY; BYDAY=FRI;  
  2. FREQ=WEEKLY; BYDAY=FRI;  
  3. FREQ=YEARLY; BYDAY=FRI;  

设置任务隔一周运行一次,并且仅在周5运行:

  1. FREQ=WEEKLY; INTERVAL=2; BYDAY=FRI;  

在每月的最后一天运行

  1. FREQ=MONTHLY; BYMONTHDAY=-1;  

三月十日开。(两个例子是等价的)

  1. FREQ=YEARLY; BYMONTH=MAR; BYMONTHDAY=10;  
  2. FREQ=YEARLY; BYDATE=0310;  

设置任务每10隔天运行:

  1. REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=10';  

设置任务在每天的下午4、5、6点时运行:

  1. REPEAT_INTERVAL => 'FREQ=DAILY; BYHOUR=16,17,18';  

设置任务在每月29日运行:

  1. REPEAT_INTERVAL => 'FREQ=MONTHLY; BYMONTHDAY=29';  

设置任务在每年的最后一个周5运行:

  1. REPEAT_INTERVAL => 'FREQ=YEARLY; BYDAY=-1FRI';  

设置任务每隔50个小时运行:

  1. REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=50';  

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

既然说到了repeat_interval,你可能要问:"有没有一种简便的方法来得出,或者说是评估出job的每次运行时间,以及下一次的运行时间呢?"dbms_scheduler包提供了一个过程evaluate_calendar_string,可以很方便地完成这个需求!

CREATE USER cedar IDENTIFIED BY cedar DEFAULT TABLESPACE CEDAR_DATA TEMPORARY TABLESPACE TEMP PROFILE DEFAULT ACCOUNT UNLOCK; -- 5 Roles for cedar GRANT DBA TO cedar; GRANT RESOURCE TO cedar WITH ADMIN OPTION; GRANT AQ_ADMINISTRATOR_ROLE TO cedar; GRANT CONNECT TO cedar WITH ADMIN OPTION; GRANT AQ_USER_ROLE TO cedar; ALTER USER cedar DEFAULT ROLE ALL; -- 44 System Privileges for cedar GRANT CREATE ANY DIRECTORY TO cedar WITH ADMIN OPTION; GRANT CREATE PUBLIC SYNONYM TO cedar WITH ADMIN OPTION; GRANT EXECUTE ANY CLASS TO cedar WITH ADMIN OPTION; GRANT DROP ANY VIEW TO cedar WITH ADMIN OPTION; GRANT CREATE CLUSTER TO cedar; GRANT ALTER SYSTEM TO cedar; GRANT UPDATE ANY TABLE TO cedar; GRANT INSERT ANY TABLE TO cedar; GRANT LOCK ANY TABLE TO cedar; GRANT CREATE EXTERNAL JOB TO cedar WITH ADMIN OPTION; GRANT EXECUTE ANY PROGRAM TO cedar WITH ADMIN OPTION; GRANT CREATE JOB TO cedar WITH ADMIN OPTION; GRANT DROP ANY DIRECTORY TO cedar WITH ADMIN OPTION; GRANT ALTER ANY TRIGGER TO cedar; GRANT CREATE DATABASE LINK TO cedar; GRANT DROP ANY TABLE TO cedar WITH ADMIN OPTION; GRANT CREATE TABLE TO cedar WITH ADMIN OPTION; GRANT QUERY REWRITE TO cedar; GRANT ANALYZE ANY TO cedar; GRANT DROP ANY TRIGGER TO cedar; GRANT EXECUTE ANY PROCEDURE TO cedar; GRANT SELECT ANY TABLE TO cedar WITH ADMIN OPTION; GRANT ALTER ANY TABLE TO cedar; GRANT UNLIMITED TABLESPACE TO cedar WITH ADMIN OPTION; GRANT CREATE SESSION TO cedar; GRANT CREATE ANY TRIGGER TO cedar; GRANT DROP ANY PROCEDURE TO cedar WITH ADMIN OPTION; GRANT ALTER ANY PROCEDURE TO cedar; GRANT DROP PUBLIC SYNONYM TO cedar WITH ADMIN OPTION; GRANT DROP ANY SYNONYM TO cedar WITH ADMIN OPTION; GRANT MANAGE SCHEDULER TO cedar WITH ADMIN OPTION; GRANT CREATE ANY PROCEDURE TO cedar; GRANT CREATE PROCEDURE TO cedar WITH ADMIN OPTION; GRANT CREATE SEQUENCE TO cedar; GRANT CREATE VIEW TO cedar WITH ADMIN OPTION; GRANT CREATE SYNONYM TO cedar; GRANT DROP ANY INDEX TO cedar; GRANT DELETE ANY TABLE TO cedar; GRANT CREATE ANY TABLE TO cedar; GRANT CREATE ANY JOB TO cedar WITH ADMIN OPTION; GRANT SELECT ANY DICTIONARY TO cedar WITH ADMIN OPTION; GRANT CREATE ROLE TO cedar; GRANT CREATE ANY SYNONYM TO cedar WITH ADMIN OPTION; GRANT ALTER SESSION TO cedar WITH ADMIN OPTION; GRANT EXECUTE ON sys.dbms_aq TO cedar; GRANT EXECUTE ON sys.dbms_aqadm TO cedar; GRANT EXECUTE ON sys.dbms_network_acl_admin TO cedar; GRANT ALL ON sys.DBMS_LOCK TO cedar; 这个SQLoracle 能用吗
06-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值