欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

使用dbms_job包创建Oracle定时任务

程序员文章站 2022-05-18 15:03:45
在oracle的包里面,有一个名字叫做dbms_job的包,它的作用是安排和管理作业队列。通过作业队列,可以让oracle定期执行特定的任务。当使用dbms_job管理作业的时候,必须确保设置了初始...

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

);

建立oracle作业的例子:

--如果表存在就删除,然后创建一个新表
drop table testjob cascade constraints;
create table testjob(
id number constraint testjob_id_pk primary key,
name varchar2(30)
);

--如果序列存在就删除,然后创建一个序列
drop sequence testjob_id_seq;
create sequence testjob_id_seq;

--创建一个序列,每一次向表中插入一条数据,并且表中的id字段值使用序列指定
create or replace procedure insert_job
is
begin
  insert into testjob values(testjob_id_seq.nextval,'test'||testjob_id_seq.currval);
  commit;
end;
/

declare
  jobno binary_integer;
begin
  --提交,操作的时间间隔设置为1分钟
  dbms_job.submit(jobno,'insert_job();',sysdate,'sysdate+1/(24*60)');
  --打印序列号
  dbms_output.put_line('jobno='||jobno);
  --运行
  dbms_job.run(jobno);
end;
/

interval参数值

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;