• 1. 创建作业、计划和时间表
  • 2. 创建轻量级作业
  • 3. 使用作业链执行一系列相关任务
  • 4. 创建窗口和作业类
  • 5. 使用高级调度程序概念确定作业优先顺序
  • Reference

实验演示准备:

--业务用户jingyu创建测试表t_times
conn jingyu/jingyu
create table t_times(col1 date);
create table t_sum(col1 date, col2 number);
create table t_times_old as select * from t_times where 1=2;
--查看当前t_times表的记录数
select count(*) from t_times;
--查看t_sum表的记录信息
select * from t_sum;--查看调度相关参数和视图:
show parameter JOB_QUEUE_PROCESSES
show parameter RESOURCE_MANAGER_PLANset linesize 140 pagesize 30
col state for a15
col job_name for a30
col owner for a15
col job_style for a30
col job_type for a30
--查询作业
select OWNER, JOB_NAME, JOB_STYLE, JOB_TYPE, STATE from DBA_SCHEDULER_JOBS;
col program_name for a30
col program_type for a30
--查询程序计划
select OWNER, PROGRAM_NAME, PROGRAM_TYPE, ENABLED, MAX_RUNS from DBA_SCHEDULER_PROGRAMS;

1. 创建作业、计划和时间表

1.1 作业

--CREATE_JOB(创建作业)
--作业功能:每秒向T_TIMES表插入当前系统时间,运行1w次后终止。
BEGIN
sys.dbms_scheduler.create_job(
job_name => '"JINGYU"."J_INSERT"',
job_type => 'PLSQL_BLOCK',
job_action => 'begin-- Insert PL/SQL code hereinsert into t_times values(sysdate);commit;
end;',
repeat_interval => 'FREQ=SECONDLY',
start_date => to_timestamp_tz('2015-12-09 05:05:00 Asia/Shanghai', 'YYYY-MM-DD HH24:MI:SS TZR'),
job_class => '"DEFAULT_JOB_CLASS"',
comments => 'Insert the current date into the T_TIMES table.',
auto_drop => FALSE,
enabled => FALSE);
sys.dbms_scheduler.set_attribute( name => '"JINGYU"."J_INSERT"', attribute => 'max_runs', value => 10000);
END;
/--ENABLE(启动作业)
exec dbms_scheduler.enable('"JINGYU"."J_INSERT"');
--DISABLE(禁用作业)
exec dbms_scheduler.disable('"JINGYU"."J_INSERT"');
--DROP_JOB(删除作业)
exec dbms_scheduler.drop_job('"J_INSERT"');

1.2 调度程序计划

--CREATE_PROGRAM(创建调度程序计划)
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=>'"JINGYU"."P_SAVEDATE"',
program_action=>'declarev_sum number;
begin-- Insert PL/SQL code hereselect count(1) into v_sum from t_times;insert into t_sum values(sysdate,v_sum);commit;
end;',
program_type=>'PLSQL_BLOCK',
number_of_arguments=>0,
comments=>'Insert the current date and the count of T_TIMES into the T_SUM.',
enabled=>FALSE);
END;
/--启用程序计划
exec dbms_scheduler.enable('"JINGYU"."P_SAVEDATE"');
--停用程序计划
exec dbms_scheduler.disable('"JINGYU"."P_SAVEDATE"');
--删除程序计划
exec dbms_scheduler.drop_program('"JINGYU"."P_SAVEDATE"');

注意:

  • 计划与作业共享相同的名称空间;后面的时间表和窗口亦是如此。
  • 一个时间表可以应用于许多作业;一个计划可以被许多作业调用。

1.3 时间表

--CREATE_SCHEDULE(创建时间表)
BEGIN
sys.dbms_scheduler.create_schedule(
repeat_interval => 'FREQ=MINUTELY',
start_date => systimestamp at time zone 'Asia/Shanghai',
comments => 'Time: 1/min',
schedule_name => '"JINGYU"."S_PER_MINUTE"');
END;
/

2. 创建轻量级作业

创建并运行轻量级作业

--依据1.2中程序计划(必须已启用)为模板,创建轻量级作业
begindbms_scheduler.create_job(job_name => 'lightweight_job_1',program_name => 'JINGYU.P_SAVEDATE',job_style => 'LIGHTWEIGHT',comments => 'summarize the count of t_times now!');
end;
/--运行轻量级作业
exec dbms_scheduler.run_job('lightweight_job_1');--连续运行100次轻量级作业
beginfor i in 1..100loopdbms_scheduler.run_job('lightweight_job_1');end loop;
end;
/--删除轻量级作业
exec dbms_scheduler.drop_job('lightweight_job_1');

3. 使用作业链执行一系列相关任务

--CREATE_PROGRAM(先创建调度程序计划P_INSERT)
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM(
program_name=>'"JINGYU"."P_INSERT"',
program_action=>'begin-- Insert PL/SQL code hereinsert into t_times_old select * from t_times;commit;execute immediate ''truncate table t_times'';
end;',
program_type=>'PLSQL_BLOCK',
number_of_arguments=>0,
comments=>'Insert into t_times_old from t_times and truncate table t_times.',
enabled=>TRUE);
END;
/--删除PROGRAM
exec DBMS_SCHEDULER.DROP_PROGRAM('P_INSERT');

3.1 创建链对象,定义链步骤,定义链规则

BEGIN--创建链sys.dbms_scheduler.create_chain( comments => 'savedata to t_sum and insert data into t_times_old',chain_name => '"JINGYU"."CHAIN1"');--定义链步骤S1sys.dbms_scheduler.define_chain_step( chain_name => '"JINGYU"."CHAIN1"',step_name => '"S1"',program_name => '"JINGYU"."P_SAVEDATE"');--定义链步骤S2sys.dbms_scheduler.define_chain_step( chain_name => '"JINGYU"."CHAIN1"',step_name => '"S2"',program_name => '"JINGYU"."P_INSERT"');--定义链规则C1_RULE1sys.dbms_scheduler.define_chain_rule( chain_name => '"JINGYU"."CHAIN1"',condition => 'TRUE',rule_name => 'C1_RULE1',action => 'START S1',comments => 'start the chain');--定义链规则C1_RULE2sys.dbms_scheduler.define_chain_rule( chain_name => '"JINGYU"."CHAIN1"',condition => 'S1 COMPLETED',rule_name => 'C1_RULE2',action => 'START S2');
END;
/--删除链
exec dbms_scheduler.drop_chain(chain_name => '"JINGYU"."CHAIN1"');
--强制删除链
BEGIN
DBMS_SCHEDULER.DROP_CHAIN (chain_name   => '"JINGYU"."CHAIN1"',force        => TRUE);
END;
/

3.2 启用、运行、监控链

--启用链
exec dbms_scheduler.enable('CHAIN1');--先验证当前数据情况
select * from t_sum order by col1;
select count(1) from t_times_old;
select count(1) from t_times;--立即运行链,从S1开始
BEGIN
dbms_scheduler.run_chain(
chain_name => 'CHAIN1',
job_name => 'J_Chain1_S1_now',
start_steps => 'S1');
END;
/
--立即运行链,指定从S2开始
BEGIN
dbms_scheduler.run_chain(
chain_name => 'CHAIN1',
job_name => 'J_Chain1_S2_now',
start_steps => 'S2');
END;
/
--结果:从S1开始,根据定义的规则,S1完成后运行S2; 而指定从S2开始就不会运行S1.
--停止上面两个JOB(这两个停止了默认就drop了)
exec DBMS_SCHEDULER.STOP_JOB('J_CHAIN1_S1_NOW');
exec DBMS_SCHEDULER.STOP_JOB('J_Chain1_S2_now');--创建定时运行链CHAIN1的作业J_chain1
BEGIN
DBMS_SCHEDULER.CREATE_JOB (job_name        => 'J_chain1',job_type        => 'CHAIN',job_action      => 'CHAIN1',repeat_interval => 'freq=daily;byhour=14;byminute=0;bysecond=0',comments        => 'A job to run chain1',enabled         => TRUE);
END;
/--停止JOB(停止会恢复JOB调度状态)
exec DBMS_SCHEDULER.STOP_JOB('J_CHAIN1');
--删除JOB
exec DBMS_SCHEDULER.DROP_JOB('J_CHAIN1');--监视作业链
select owner, chain_name, enabled, comments from dba_scheduler_chains;

4. 创建窗口和作业类

--创建窗口
BEGIN
DBMS_SCHEDULER.CREATE_WINDOW(
window_name=>'"NOON_WINDOW"',
resource_plan=>'DEFAULT_MAINTENANCE_PLAN',
start_date=>to_timestamp_tz('2015-12-22 Asia/Shanghai', 'YYYY-MM-DD TZR'),
duration=>numtodsinterval(60, 'minute'),
repeat_interval=>'FREQ=DAILY;BYHOUR=0;BYMINUTE=0;BYSECOND=0',
end_date=>null,
window_priority=>'LOW',
comments=>'Task running over the lunch hour every day.');
END;
/--创建作业类
BEGIN
sys.dbms_scheduler.create_job_class(
logging_level => DBMS_SCHEDULER.LOGGING_RUNS,
log_history => 60,
resource_consumer_group => 'LOW_GROUP',
comments => 'Jobs for test',
job_class_name => '"TEST JOBS"');
END;
/

5. 使用高级调度程序概念确定作业优先顺序

5.1 使用作业类

--作业"J_INSERT"添加到作业类"TEST JOBS"
exec dbms_scheduler.set_attribute(name=>'J_INSERT', attribute=>'job_class', value=>'"TEST JOBS"');--设置作业"J_INSERT"优先级为1
exec dbms_scheduler.set_attribute(name=>'J_INSERT', attribute=>'job_priority', value=>1);
--注:作业优先级的值1~5,1的优先级最高。--作业类可以控制日志记录级别
--查询DBA_SCHEDULER_JOB_LOG视图
select * from DBA_SCHEDULER_JOB_LOG;
select job_name, log_date, status from DBA_SCHEDULER_JOB_LOG;
--查询DBA_SCHEDULER_JOB_RUN_DETAILS视图
select * from DBA_SCHEDULER_JOB_RUN_DETAILS;

5.2 使用窗口

如果关闭窗口时,窗口中尚存在正在运行的作业,默认作业会继续运行完。

--查询作业信息
set linesize 200
col owner for a30
col job_name for a35
select owner, job_name, stop_on_window_close, job_priority from dba_scheduler_jobs;--设置stop_on_window_close属性(This attribute only applies if the schedule of a job is a window or a window group.)
--a.先把作业"J_INSERT"设置为窗口"NOON_WINDOW"
BEGIN
sys.dbms_scheduler.set_attribute_null( name => '"JINGYU"."J_INSERT"', attribute => 'start_date');
sys.dbms_scheduler.set_attribute_null( name => '"JINGYU"."J_INSERT"', attribute => 'repeat_interval');
sys.dbms_scheduler.set_attribute_null( name => '"JINGYU"."J_INSERT"', attribute => 'end_date');
sys.dbms_scheduler.set_attribute( name => '"JINGYU"."J_INSERT"', attribute => 'schedule_name', value => '"SYS"."NOON_WINDOW"');
END;
/
--b.设置作业"J_INSERT"的属性stop_on_window_close
BEGIN
sys.dbms_scheduler.disable( '"JINGYU"."J_INSERT"' );
sys.dbms_scheduler.set_attribute( name => '"JINGYU"."J_INSERT"', attribute => 'stop_on_window_close', value => TRUE);
sys.dbms_scheduler.enable( '"JINGYU"."J_INSERT"' );
END;
/

Reference

  • OCP 认证考试指南 (1Z0-053)[M]. 清华大学出版社, 2010.

使用Oracle调度程序自动完成任务相关推荐

  1. Linux oracle数据库自动备份自动压缩脚本代码

    Linux oracle数据库自动备份自动压缩脚本代码 Linux oracle数据库备份完成后可以自动压缩脚本代码. 复制代码代码如下: #!/bin/bash #backup.sh #edit: ...

  2. oracle数据库自动备份

    oracle数据库自动备份 环境:windows server2008操作系统,oracle 10.2.0数据库 工具:windows命令窗口 ,windows任务计划 命令:exp  profile ...

  3. delphi Oracle导出多个表,Oracle数据库自动备份工具(Delphi源码)

    Oracle数据库自动备份工具(Delphi源码) 下载地址:http://www.blogjava.net/Files/96sd2/OraSvr.rar 『OracleBackupService』简 ...

  4. Oracle数据库自动存储管理(ASM)

    关于ASM的讨论很多,但是到底什么是ASM?ASM是一个有效的抽象层,使你的Oracle数据库可以与叫做diskgroups的抽象空间一起使用,而不是直接使用datafiles.这带来了很多好处,但是 ...

  5. 你知道吗?其实 Oracle 直方图自动统计算法存在这些缺陷!(附验证步骤)

    作者 | 吴海存 责编 | Carol 出品 | CSDN 云计算(ID:CSDNcloud) 封图| CSDN下载于视觉中国 在某些场景下,表中某一列的数据分布会比较崎岖,使得CBO(cost ba ...

  6. oracle 自动表分析,其实 Oracle 直方图自动统计算法存在这些缺陷!

    原标题:其实 Oracle 直方图自动统计算法存在这些缺陷! 科技细分领域TOP10影响力内容第一季度入选作品 来源 | CSDN 作者 | 吴海存 在某些场景下,表中某一列的数据分布会比较崎岖,使得 ...

  7. Oracle 数据库自动诊断库 ADR(Automatic Diagnostic Repository)简介

    作者介绍 姚远:鼎甲科技高级技术顾问,墨天轮MVP.Oracle ACE,华为云MVP,专注于 Oracle.MySQL 数据库多年,拥有 Oracle 10g.12c OCM, MySQL 5.6. ...

  8. 重新启动oracle 服务,在linux重新启动下如何设置oracle服务自动开启

    在linux重新启动下如何设置oracle服务自动开启 发表于2021 2019-12-17 |  没有评论 2.  修改文件/etc/rc.local添加一下两行 su  -  oracle  -c ...

  9. oracle asm 缺省用户,oracle asm自动存储使用及管理说明(下)

    接上篇:oracle asm自动存储使用及管理说明(上) 六.文件及tempate 1.数据文件命名含义 SQL> select file_name from dba_data_files; F ...

最新文章

  1. 编译原理练习题(第三章)
  2. Java开发微信的6个步骤
  3. node.js小技巧——使用 supervisor
  4. C++基础( C++初识、数据类型、运算符、程序流程结构、)
  5. javascript中的后退和刷新
  6. leetcode258. 各位相加(简单题,但是你不看答案想不出来)
  7. PRML-系列一之1.5.1~1.5.3
  8. 设计模式之单例模式的多重实现
  9. 腾讯云游戏新进展:WeGame云游戏功能已落地全国9省市
  10. JS获取整个HTML网页代码 - Android 集美软件园 - 博客频道 - CSDN.NET
  11. SPSS 偏相关分析【SPSS 024期】
  12. mysql 函数 截取,MySQL 字符串函数:字符串截取
  13. 大型分布式网站术语分析
  14. 微信云开发要避开的坑
  15. 【IT职场】2013中国IT领袖峰会马云演讲实录
  16. 数仓建设保姆级5W字教程,离线实时一网打尽(理论+实战)
  17. c语言台阶,关于C语言跳台阶问题的解决方法
  18. JavaScript的相关知识与问题
  19. uva 10118 - Free Candies(记忆化搜索)
  20. 网站导航SEO优化技巧

热门文章

  1. c语言函数调用编译等腰三角形,C语言如何输出带“*”的等腰三角形? – 手机爱问...
  2. mongodb 用户 设计_MongoDB 是什么?看完你就知道了
  3. vue 公用页面引用_vue中实现部分页面引入公共组件
  4. python导入matplotlib出错_解决导入matplotlib的RuntimeError: Python is not installed as a framework....
  5. 软件项目管理大作业_案例|P6软件在水电项目施工管理中的应用
  6. Java学习总结:47(打印流)
  7. qrcode生产带logo_“白板”口罩打上LOGO装名牌 警方重拳出击清市场
  8. Java项目:植物大战僵尸(java+swing)
  9. 【转载】JUnit各个注解的含义
  10. 线程、线程匿名内部类、解决线程不安全的方式