dbms_job是什么?
dbms_job是oracle数据库提供的专家程序包的一个.
主要用来在后台运行程序,是数据库中一个极好的工具. 可用于自动调整调度例程任务,例如分析数据表,执行一些归档操作,清理草稿表等等.
使用语法说明. 使用dbms_job主例程是submit例程, 对submit例程中的各变量含义说明:
job: 一个作业标识符,由系统来分配(out参数).
what: 将要运行的sql文本,必须是有效的pl/sql语句或一段代码. 例如: 运行存储过程p,,可以传递字符串p;(包括分号)给这个例程。无论在what参数中提交什么,将被封装成如下pl/sql块:
declare
job binary_integer := :job;
next_date date := :mydate;
broken boolean := false;
begin
what
:mydate := next_date;
if broken then :b := 1;
else :b := 0;
end if;
end;
next_date: 日期函数字符串,用来计算作业下次运行的时间.
no_parse: 确定what参数在提交时是否进行有效性分析。
instance: 只得在松耦合聚簇的机器上,在并行服务器模式(一个oracle可以运行的模式)下才有意义,这将指定在哪个实例上作业可以执行.
force: 只有在并行服务器模式下才有意义. 如设置为true(默认值),可以使用任何实例数据库提交作业, 如设置为false, 相关实例不可用,提交请求将失败.
在dbms_job程序包中也有其它入口点. submit是用来调度作业的一个,其他的允许操作已调度的作业,执行操作,如run,remove和change操作.
示例 设原有存储过程为:pr_movedetail(业务存储过程), 执行大数据量操作, 操作耗时.
利用dbms_job包功能, 将存储过程的执行集中提交给oracle job来处理, 客户端无需等待.
1. 创建一张表,包含每个参数的字段,再加一个id主码字段.
create table run_movedetail
(
id number primary key,
param1 varchar2(255),
param1 varchar2(255),
rundate date
)
此表不仅作为将要提交的处理过程排队的地方,而且当提交时,也可作为已提交处理过程保存永久日志的地方.
2. 创建fast_movedetail存储过程(创建作业id及把各参数insert到run_movedetail).
create or replace procedure fast_movedetail(p_param1 varchar2,p_param2 varchar2)
as
l_job number;
begin
dbms_job.submit(l_job,’background_movedetail(job);’);
insert into run_movedetail(id,param1,parma2) values (l_job, p_param1, p_param2);
end;
该例程将提交一项作业background_movedetail,并且将它传递给job参数.
3. 创建background_movedetail存储过程.
create or replace procedure background_movedetail(p_job in number)
as
l_rec run_movedetail%rowtype;
begin
select * into l_rec from run_movedetail where id = p_job;
pr_movedetail(l_rec.param1,l_rec.param2); //业务存储过程调用
update run_movedetail set rundate = sysdate where id = p_job;
//调用实际使用的pr_movedetail例程, 然后更新记录,记录实际提交时间.
end;
最后在客户端直接调用fast_movedetail即可.
