【赛迪网-it技术报道】本文中,我们根据一段错误代码从而来分析如何解决job的interval输入参数过长的问题。
给出的运行job的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作为存储过程的输出参数,来指定下次job的下次运行时间。
第一次看到这里的时候,一方面是感叹这种内部的东西,一般人是无法得到的,只有tom这种内部人士才能得到;另一方面是佩服tom的功力,说实话,即使是把代码给我,我也想不出这么巧妙的方法。
这次重读这部分内容,有了一点新的想法,对于broken变量,是否也可以做点什么?
采用和上面类似的方法,可以控制job的行为,使job成功运行一次后,就自动停止不在执行。由于普通的一次性job,在运行后就从job视图中消失了,如果希望留下运行信息,则必须使用日志表,十分的麻烦。而采用下面的方法处理一次性job,可以方便将job的运行信息保留下来:
sql> conn /@yangtk as sysdba
已连接。
sql> grant execute on dbms_lock to yangtk;
授权成功。
sql> conn yangtk/yangtk@yangtk
已连接。
sql> create or replace procedure p_test (p_broken out boolean) as
2 begin
3 p_broken := true;
4 dbms_lock.sleep(5);
5 end;
6 /
过程已创建。
sql> declare
2 v_job number;
3 begin
4 dbms_job.submit(v_job, 'p_test(broken);', sysdate, 'sysdate + 1/1440');
5 commit;
6 end;
7 /
pl/sql 过程已成功完成。
sql> col what format a30
sql> select job, what, total_time,
broken, failures from user_jobs;
job what total_time b failures
---------- ------------------------------
6 p_test(broken); 3 n
sql> select job, what, total_time, broken,
failures from user_jobs;
job what total_time b failures
---------- ------------------------------
6 p_test(broken); 5 y 0
|
采用这种方法,运行一次后,job不再运行,但是job信息并没有丢失,仍然保留在user_jobs视图中。