使用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

);

建立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;
(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐