在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;