使用DBMS_JOB包创建ORACLE定时任务

在Oracle的包里面,有一个名字叫做DBMS_JOB的包,它的作用是安排和管理作业队列。通过作业队列,可以让Oracle数据库定期执行特定的任务。当使用DBMS_JOB管理作业的时候,必须确保设置了初始化参数JOB_QUEUE_PROCESSES(不能为0)。

1、 SUBMIT

该过程用于建立一个新的作业,当建立作业的时候,需要通过设置相应的参数来告诉Oracle要执行的内容,要执行的时间,要执行任务的间隔。如下格式:

DBMS_JOB.SUBMIT(

JOB OUT BINARY_INTERGER,

WHAT IN VARCHAR2,

NEXT_DATE IN DATE DEFAULT SYSDATE,

INTERVAL IN VARCHAR2 DEFAULT ‘NULL’,

NO_PARSE IN BOOLEAN DEFAULT FALSE,

INSTANCE IN BINARY_INTEGER DEFAULT ANY_INSTANCE,

FORCE IN BOOLEAN DEFAULT FALSE

);

参数说明


编号


参数


参数说明


1


job


用于指定作业编号


2


what


用于指定作业要执行的操作


3


next_date


用于指定该操作的下一次运行的日期


4


interval


用于指定该操作的时间间隔


5


no_parse


用于指定是否需要解析与作业相关的过程


6


instance


用于指定哪个例程可以运行作业?


7


force


用于指定是否强制运行与作业相关的例程

建立Oracle作业的例子:

DECLARE

JOBNO NUMBER;                    --通过查看该变量可以得到返回的作业编号

BEGIN

DBMS_JOB.SUBMIT(

JOBNO,

‘PRC_SENDTOGX;‘,           --执行工信局提供数据的脚本程序

SYSDATE,                   --现在执行

‘SYSDATE+1‘

);

END;

interval参数值


描述


Interval参数值    (部分需要验证一下)


每天午夜12点


‘TRUNC(SYSDATE + 1)‘


每天早上8点30分


‘TRUNC(SYSDATE + 1) + (8*60+30)/(24*60)‘


每星期二中午12点


‘NEXT_DAY(TRUNC(SYSDATE ), ‘‘TUESDAY‘‘ ) + 12/24‘


每个月第一天的午夜12点


‘TRUNC(LAST_DAY(SYSDATE ) + 1)‘


每个季度最后一天的晚上11点


‘TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ‘Q‘ ) -1/24‘


每分钟执行一次


‘SYSDATE+1/1440‘

2、 REMOVE

这个过程的作用是用于删除作业队列当中的特定的作业,它的语法如下:

DBMS_JOB.REMOVE(JOB IN BINARY_INTEGER);

下面是一个删除作业的例子:

首先查看DBA_JOBS表,看表里面有哪些任务正在执行着?

SELECT * FROM DBA_JOBS;

可以看到里面的JOB就是我们要删除的作业的编号,LOG_USER是创建该任务的人。

SQL> EXEC DBMS_JOB.REMOVE(467);

SQL>COMMIT;

这样就能把已经建立的作业删除了。

3、 CHANGE

该过程改变与作业相关的所有的信息,其中包括作业的操作内容,作业运行的时间以及运行时间间隔信息等等。语法如下:

DBMS_JOB.CHANGE(

JOB IN BINARY_INTEGER,

WHAT IN VARCHAR2,

NEXT_DATE,

INTERVAL IN VARCHAR2,

INSTANCE IN BINARY_INTEGER DEFAULT NULL,

FORCE IN BOOLEAN DEFAULT FALSE

);

例子:

SQL>EXEC DBMS_JOB.CHANGE(2,NULL,NULL,’SYSDATE+2’);

SQL>COMMIT;

4、 WHAT

WHAT用来改变作业要执行的操作,例如:

SQL>EXEC DBMS_JOB.WHAT(268,’GETGX_AC01;’);

5、 NEXT_DATE

用来改变作业的下次运行日期

SQL>EXEC DBMS_JOB.NEXT_DATE(‘478’,’SYSDATE+2’);

6、 INTERVAL

该过程用来改变作业的运行时间间隔,下面的运行时间间隔修改为每分钟执行一次:

SQL>exec dbms_job.interval(478,’SYSDATE+1/24/60

7、 BROKEN

该过程用于给该作业打上中断标志,可以在DBA_JOBS表里面观察该作业的BROKEN标志知否为中断。例子:

SQL>EXEC DBMS_JOB.BROKEN(478,TRUE);

SQL>COMMIT;

8、 RUN

该过程用来执行该作业,例子:

SQL>EXEC DBMS_RN(478);

SQL>COMMIT;

常见问题:

1、  如何停止一个作业?

SQL>DBMS_JOBS.BROKEN(2,TRUE);

SQL>COMMIT;

这里务必要提交哈!

2、  如何启动一个作业?

SQL>DBMS_JOBS.BROKEN(2,FALSE);

SQL>COMMIT;

这里也务必要提交,否则就没有效果

3、  前面提到的JOB_QUEUE_PROCESSES在什么地方设置?

ALTER  SYSTEM  SET  job_queue_processes=39 SCOPE=SPFILE;

这个SQL的执行是需要具备相应的权限的。

4、  如何计算一个过程运行的时间(DATE和TimeStamp)?

可以在过程的开始设置一个时间,然后在过程的结尾处设置一个时间,然后两个时间的时间差可以计算出该过程运行的时间。通过实践发现使用SYSESTAMP来计算时间比较准确一些:

SELECT to_char(systimestamp,‘yyyy-mm-dd hh24:mi:ss:ff4‘) FROM dual;

示例:

var jobno number;

begin

dbms_job.submit(:jobno,‘p_xxx_taxis;‘,trunc(sysdate)+(18/24),‘trunc(sysdate+1,‘‘hh‘‘)‘);--每天18点执行

commit;

end;

上面这段话要在 命令窗口 下运行,如在pl/sql developer里面的-->新键-->命令窗口

时间: 2024-10-11 10:18:03

使用DBMS_JOB包创建ORACLE定时任务的相关文章

PLSQL创建Oracle定时任务

1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据 2.定时器对应的DBMS_Jobs文件夹,右键新建(new) 3.创建任务 注:job的定时执行和时间间隔说明 查看任务 在使用oracle最匹配的工具plsql的时候,如果用plsql创建定时器呢?下面我简单介绍使用工具创建定时器的方法: 回到顶部 1.创建任务执行的存储过程,如名称为YxtestJob,向测试表中插入数据   回到顶部 2.定时器对应的DBMS_Jobs文件夹,右键新建(new) 回到顶部 3.创建任

oracle定时任务

一.简介 当我们需要oracle数据库定时自动执行一些脚本,或进行数据库备份.数据库的性能优化,包括重建索引等工作是需要使用到定时任务. 定时任务可以使用以下两种完成. 1.操作系统级的定时任务,win的定时任务,unix的crontab 2.数据库级的定时任务. 相对来说,数据库的定时任务效率会更高. oracle的定时任务:使用oracle定时任务时,需要使用到oracle中dbms_job.submit函数. DBMS_JOB过程的公共参数 Job BINARY_INTEGER 任务的唯一

Oracle定时任务(1)-DBMS_SCHEDULER

来自:http://blog.csdn.net/fw0124/article/details/6753715 Oracle 10g之前,可以使用dbms_job来管理定时任务.10g之后,Oracle引入dbms_scheduler来替代先前的dbms_job,在功能方面,它比dbms_job提供了更强大的功能和更灵活的机制/管理. 使用dbms_scheduler创建一个定时任务有两种形式1)创建1个SCHEDULER来定义计划,1个PROGRAM来定义任务内容,再创建1个JOB,为这个JOB

Oracle 定时任务讲解

前几天,公司的job调度出现了问题,由于权限管的严,没有查看oracle 一些重要的数据字典,后面联系DBA,是由于数据库切换到备机时,参数设置不对,导致db job没有正常调度. 今天刚好有时间,想总结下 oracle 的定时任务,写的不好的地方,请多少指教! --1.先检查 oracle job 两个重要参数 job_queue_processes 和 aq_tm_processes SQL> show parameter job_queue_processes;NAME TYPE VALU

如何手动创建oracle数据库

下面的实验室是如何不要通过DBCA创建ORACLE 数据库,而是通过ORACLE ONLINE HELP DOCUMENT进行手动的创建数据库的详细步骤: 1,编辑Oracle profile [[email protected] ~]# su - oracle [[email protected] ~]$ vi ./.bash_profile PATH=$PATH:$HOME/bin export PATH export ORACLE_BASE=/u01/app/oracle export O

怎样手动创建oracle数据库

以下的实验室是怎样不要通过DBCA创建ORACLE 数据库,而是通过ORACLE ONLINE HELP DOCUMENT进行手动的创建数据库的具体步骤: 1,编辑Oracle profile [[email protected] ~]# su - oracle [[email protected] ~]$ vi ./.bash_profile PATH=$PATH:$HOME/bin export PATH export ORACLE_BASE=/u01/app/oracle export O

创建ORACLE JOB

oracle job简介 主要的使用情景 定时在后台执行相关操作:如每天晚上0点将一张表的数据保存到另一张表中,2:定时备份数据库等 熟化说万事开头难,这里我只简单记述一个创建一个简单的job 步骤如下: 1.创建一张表g_test create table G_TEST ( ID     NUMBER(12), C_DATE DATE ) 2.创建一个sequence create sequence G_SEQ minvalue 1 maxvalue 999999999999999999999

手动创建oracle数据库_oracle11g

通过手动创建oracle数据库,可以了解oracle数据库的结构和数据库运行机制,对理解oracle数据库有帮助. 一.打开命令行工具,创建必要有相关目录 mkdir E:\app\Administrator\admin\sky mkdir E:\app\Administrator\admin\sky\adump mkdir E:\app\Administrator\admin\sky\dpdump mkdir E:\app\Administrator\admin\sky\pfile mkdir

oracle 定时任务 job 调用存储过程有回到输出参数(含out参数)

oracle 定时任务 job 调用存储过程有返回输出参数(含out参数) 因前台调用一个含有OUT参数的存储过程,同时在JOB里也想调用同一个存储过程,不想将OUT参数去掉重新建一个存储过程再被JOB调用.虽然OUT参数在JOB里没有任何意义,但是考虑到程序最简化,不重复建设,采用了如下方法,即在调用存储过程前先定义参数变量.以下s1,s2均为OUT参数,希望对大家有所帮助.begin  sys.dbms_job.submit(job => :job1,