一、简介
  当我们需要oracle数据库定时自动执行一些脚本,或进行数据库备份、数据库的性能优化,包括重建索引等工作是需要使用到定时任务。

  定时任务可以使用以下两种完成。
  1、操作系统级的定时任务,win的定时任务,unix的crontab
  2、数据库级的定时任务。
  相对来说,数据库的定时任务效率会更高。
  oracle的定时任务:使用oracle定时任务时,需要使用到oracle中dbms_job.submit函数。

DBMS_JOB过程的公共参数

Job BINARY_INTEGER 任务的唯一识别号
What VARCHAR2 作为任务执行的PL/SQL代码
Next_date VARCHAR2 任务下一次运行的时间
Interval VARCHAR2 日期表达式,用来计算下一次任务运行的时间

1、job参数
  job是一个整数,用来唯一标示一个任务。该参数既可由用户指定也可由系统自动赋值,这取决于提交任务时选用了哪一个任务提交过程。DBMS_JOB.SUBMIT过程通过获得序列SYS.JOBSEQ的下一个值来自动赋予一个任务号。该任务号是作为一个OUT参数返回的,所以调用者可以识别出提交的任务。而DBMS_JOB.ISUBMIT过程则由调用者给任务指定一个识别号,此时,任务号的唯一性就完全取决于调用者。 除了删除或者重新提交任务,一般来说任务号是不能改变的。即使当数据库被导出或者被导入这样的情况,任务号也将被保留下来。所以在执行含有任务的数据的导入/导出操作时很可能会发生任务号冲突的现象。

2、what
  what参数是一个可以转化为合法PL/SQL调用的字符串,该调用将被任务队列自动执行。在what参数中,如果使用文字字符串,则该字符串必须用单引号引起来。 what参数也可以使用包含我们所需要字符串值的VARCHAR2变量。实际的PL/SQL调用必须用分号隔开。在PL/SQL调用中如果要嵌入文字字符串,则必须使用两个单引号。 what参数的长度在Oracle7.3中限制在2000个字节以内,在Oracle 8.0以后,扩大到了4000个字节,这对于一般的应用已完全足够。该参数的值一般情况下都是对一个PL/SQL存储过程的调用。实际经验就是最好将存储过程调用封装在一个匿名块中,这样可以避免一些错误的产生。如,一般情况下,what参数可以这样引用: what =>’my_procedure(parameter1);’ 但是比较安全的引用,应该这样写:what =>’begin my_procedure(parameter1); end;’。任何时候,我们只要通过更改what参数就可以达到更改任务定义的目的。但是有一点需要注意,通过改变what参数来改变任务定义时,任务的运行时间将还是和之前的一样。需要重新设置新的运行时间,从而达到定时任务的目的。

3、next_date
  next_date参数是用来调度任务队列中该任务下一次运行的时间。这个参数对于DBMS_JOB.SUBMIT和DBMS_JOB.BROKEN这两个过程默认为系统当前时间,也就是说任务将立即运行。当将一个任务的next_date参数赋值为null时,则该任务下一次运行的时间将被指定为4000年1月1日,也就是说该任务将永远不再运行。但是,如果想在任务队列中保留该任务而又不想让其运行,可以将next_date设置为null。Next_date也可以设置为过去的一个时间。系统任务的执行顺序是根据它们下一次的执行时间来确定的,所以将next_date参数设置回去就可以达到将该任务排在任务队列前面的目的。这在当任务队列进程不能跟上将要执行的任务或者一个特定的任务需要尽快执行的时候可以这样设置。

4、Interval
  interval 参数 是一个表示Oracle合法日期表达式的字符串。这个日期字符串的值在每次任务被执行时算出,算出的日期表达式有两种可能,要么是未来的一个时间要么就是null。next_date是在一个任务开始时算出的,而不是在任务成功完成时算出的。 当任务成功完成时,系统通过更新任务队列目录表将前面算出的next_date值置为下一次任务要运行的时间。当由interval表达式算出next_date是null时,任务自动从任务队列中移出,不会再继续执行。因此,如果传递一个null值给interval参数,则该任务仅仅执行一次。 通过给interval参数赋各种不同的值,可以设计出复杂运行时间计划的任务。

二、例子

  存储过程更多情况是在数据库方作数据整合等复杂的工作.比如银行系统,数据相当重要,每天需要备份重要表的数据。每天的数据有十多万,此时需要用到定时任务进行备份。

一般思路如下:
1.每天备份完数据之后,max(id)存到一张表
2.下次备份的时候select max(id);
3.select * from table where id > max(id);

  示例代码:

每分钟备份一次person表中增加的记录

person表结构如下:

CREATE TABLE person(
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
)

备份表person_back表结构如下:

CREATE TABLE person_back (
id NUMBER(11) NOT NULL ,
username VARCHAR2(255 ) NULL ,
age NUMBER(11) NULL ,
password VARCHAR2(255) NULL ,
PRIMARY KEY (id)
)

辅助表tb_maxid,用于存放当前person表中最大的id

create table tb_maxid(id number);
insert into tb_maxid values(0);

其他代码如下:

/*
1、提取person,所有数据
2、循环插入到person_back表中
3、完成之后记录max(id)到tb_maxid表 主要问题:
1、如果在循环中commit,效率会很低
2、假设数据很大(千万)回滚段不够(抛异常)。回滚段的默认大小可以设置
2.1、加大回滚段。
2.2分段提交
*/
-- 存储过程,保存person记录
create or replace procedure pro_back_person(
v_maxid number
)
is
-- 定义游标
cursor c_person is
select * from person where id > v_maxid;
--定义rowtype
r_person person%rowtype;
--判断循环次数
v_index number := 0;
--
v_max number;
begin
-- 判断游标是否打开
if c_person%isopen then --游标打开
null;
else
open c_person;
end if;
--循环备份数据
loop
fetch c_person into r_person;
exit when c_person%notfound; insert into person_back values(r_person.id,r_person.username, r_person.age, r_person.password); --分段提交
v_index := v_index + 1;
if(v_index = 2000) then
commit;
v_index := 0;
end if; end loop;
commit; --再次提交数据 select max(id) into v_max from person_back;
update tb_maxid set id = v_max;
commit;
--关闭游标
close c_person;
end pro_back_person;
-- 调用保存记录的存储过程
create or replace procedure invokebackpro
is
v_maxid number;
begin
select id into v_maxid from tb_maxid;
pro_back_person(v_maxid);
end invokebackpro;
-- 创建任务定时器
declare
jobno number;
begin
dbms_job.submit(
jobno,
what => 'invokebackpro;', --invokebackpro为存储过程的名称
Interval => 'TRUNC(sysdate, ''mi'')+1/(24*60)' --定义事件间隔每分钟
);
commit;
end;

三、其他相关

一些常见Interval设置如下:

1、每分钟执行
Interval => TRUNC(sysdate, 'mi') + 1/(24*60)
2、每天定时执行(每天的凌晨2点执行)
Interval => TRUNC(sysdate) + 1 + 2/(24)
3、每周定时执行(每周一凌晨2点执行)
Interval => TRUNC(next_day(sysdate, 2)) + 2/(24)
4、每月定时执行(每月1日凌晨2点执行)
Interval => TRUNC(ADD_MONTHS(sysdate)) + 1 + 2/24
5、没季度定时执行(没嫉妒的定义天凌晨2点执行)
Interval => TRUNC(ADD_MONTHS(sysdate, 3), 'Q') + 2/24
6、每半年定时执行(每年7月1日和1月1日凌晨2点)
Interval => TRUNC(ADD_MONTHS(sysdate, 'yyyy'), 6) + 2/24
7、每年定时执行(每年1月1日凌晨2点执行)
Interval => TRUNC(ADD_MONTHS(sysdate, 'yyyy'), 12) + 2/24

  oracle中关于定时器的数据字典如下:
  DBA_JOBS 本数据库中定义到任务队列中的任务
  DBA_JOBS_RUNNING 目前正在运行的任务
  USER_JOBS 当前用户拥有的任务

oracle定时任务的更多相关文章

  1. 最简单的一个Oracle定时任务

    最简单的一个Oracle定时任务一.在PLSQL中创建表:create table HWQY.TEST(CARNO     VARCHAR2(30),CARINFOID NUMBER) 二.在PLSQ ...

  2. Oracle定时任务Job笔记

    定时任务应用场景: 某一个生产系统上面,临时表不断变多,占了不少磁盘空间.由于这套软件是直接买的,不方便修改源代码.所以考虑使用Oracle定时任务直接从数据库层删除临时表. 定时任务业务: 首先写好 ...

  3. 【Oracle】使用dbms_job包创建Oracle定时任务

           在Oracle的包里面,有一个名字叫做DBMS_JOB的包,它的作用是安排和管理作业队列.通过作业队列,可以让Oracle数据库定期执行特定的任务.当使用DBMS_JOB管理作业的时候, ...

  4. oracle 定时任务例子【项目例子】

    说明:请在plsql工具的命令窗口中,依次按步骤执行如下脚本   (1)建立备份表 my_test_log2create table my_test_log2 as select * from my_ ...

  5. 利用Oracle定时任务重置序列

    业务需求是:二元化编号规则:RYH+年月+001(开始),按月计算,每月1号重置为001 数据库中已有序列和函数如下: 解决方法:采用Oracle定时任务,每月1号重置该序列从1开始增长,SQL如下: ...

  6. Oracle学习(十)Oracle定时任务

    一.Oracle定时任务基础 简介 oracle job 是应用在数据库层面,用来定时执行存储过程或者 SQL 语句的定时器. 查询 --当前库中运行的 job SELECT t.* FROM dba ...

  7. oracle系统包——dbms job用法(oracle定时任务)

    用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点1.创建job:variable jobno number;dbms_job.su ...

  8. oracle定时任务(dbms_job)

    author:skate time:2007-09-12 http://publish.it168.com/2006/0311/20060311017002.shtml 今天总结下Oracle的任务队 ...

  9. oracle系统包——dbms_job用法(oracle定时任务)

    用于安排和管理作业队列,通过使用作业,可以使ORACLE数据库定期执行特定的任务. 一.dbms_job涉及到的知识点1.创建job:variable jobno number;dbms_job.su ...

随机推荐

  1. f4: Facebook’s Warm BLOB Storage System——Erasure Code

    Facebook在OSDI 2014上发表论文f4: Facebook's Warm BLOB Storage System,这个系统主要目的就是降低存储成本,在容忍磁盘,主机,机架,数据中心的同时提 ...

  2. MVC视图展现模式之移动布局

    参考:http://www.cnblogs.com/dunitian/p/5218140.html 简单点,直接上用法 新建MVC项目,在golbal.asax中添加如下代码 //添加一个自定义后缀 ...

  3. Android开发更改应用图标无效的问题

    引子: 由于最近公司产品转战移动端,而且就要在年底前上线第一个版本,作为主工不得不立即投入到Android开发的学习中,昨天一天在家找了一些资料,看了一些视频,也试着弄了一个简单的应用. 问题: 本来 ...

  4. IIS 503日志文件在哪

    概述  503:“服务不可用”错误是一个非自定义的错误,该错误表示服务器当前无法处理该请求. 可能原因:1.管理员可能关闭应用程序池以执行维护.2.当请求到达时应用程序池队列已满.3.应用程序池标识没 ...

  5. 重新想象 Windows 8 Store Apps (62) - 通信: Socket TCP, Socket UDP

    [源码下载] 重新想象 Windows 8 Store Apps (62) - 通信: Socket TCP, Socket UDP 作者:webabcd 介绍重新想象 Windows 8 Store ...

  6. C#根据CPU+磁盘标号来注册软件

    很多私人软件都需要自己的作品出售给别人只能一台电脑使用,不可以随便一个电脑都可以运行自己的软件,所以就有了软件注册限制的控制,收集了一个注册软件的帮助类,分享记录一下. 功能介绍:    根据CPU+ ...

  7. mysql学习笔记 第七天

    数据库的备份与还原 数据库的备份与还原是后面章节的内容,但是在学习的时候已经需要数据的备份与还原了,所以就了解了一下.数据库有很多种备份方法,我学习的是其中的一种 备份: 对于数据库的备份: C:&g ...

  8. 回文串--- Girls' research

    HDU   3294 Problem Description One day, sailormoon girls are so delighted that they intend to resear ...

  9. .NET Core 和 ASP.NET 5 RC1 发布

    昨天微软发布了 .NET Core 和 ASP.NET 5 候选版本,支持 Windows,Linux 和 OS X 平台,版本 License 为 "Go Live",,也就是说 ...

  10. uploadify API

    apifunctionjavascriptflashsecurity服务器 属性: uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击 ...