使用dbms_job包提供的功能可以实现后台自动执行的定时操作。
首先把要执行的操作做成一个存储过程,如p_dojob。然后用dbms_job提供的submit方法创建一个事务(job),大概语法如下:
declare
n number ;
begin
dbms_job.submit(n, 'p_ xxx; ' , begindate, ' begindate + d ' );
commit ;
end ;
n number ;
begin
dbms_job.submit(n, 'p_ xxx; ' , begindate, ' begindate + d ' );
commit ;
end ;
解释一下:
--p_xxx:过程名,如写成p_xxx;
--begindate:开始时间。立即执行设为sysdate,如果想设定时间比如晚上8电开始则写成: trunc(sysdate)+20/24
--'begindate + d':间隔执行,d为间隔天数,如果想设为间隔1小时则设为1/24,如果只执行一次,则填null;
示例如下:
SQL
>
declare
2 n number ;
3 begin
4 dbms_job.submit(n, ' p_dojob; ' , sysdate, ' sysdate + 1/3600 ' );
5 commit ;
6 end ;
7 /
PL / SQL procedure successfully completed
SQL >
2 n number ;
3 begin
4 dbms_job.submit(n, ' p_dojob; ' , sysdate, ' sysdate + 1/3600 ' );
5 commit ;
6 end ;
7 /
PL / SQL procedure successfully completed
SQL >
可以从user_jobs视图查看你所有的事务:
SQL
>
select
job,next_date,next_sec,failures,broken
from
user_jobs;
JOB NEXT_DATE NEXT_SEC FAILURES BROKEN
-- -------- ----------- ---------------- ---------- ------
458691 2007 - 6 - 6 16 16 : 19 : 20 0 N
437318 2007 - 6 - 7 00 : 00 : 00 0 N
462099 4000 - 1 - 1 00 : 00 : 00 16 Y
SQL >
JOB NEXT_DATE NEXT_SEC FAILURES BROKEN
-- -------- ----------- ---------------- ---------- ------
458691 2007 - 6 - 6 16 16 : 19 : 20 0 N
437318 2007 - 6 - 7 00 : 00 : 00 0 N
462099 4000 - 1 - 1 00 : 00 : 00 16 Y
SQL >
如果事务到预定时间并没有执行,排除是过程本身的问题外,可能的原因是初始化参数job_queue_processes值为0或没有设置。用alter system set job_queue_processes=n;(n>0)做好设置。注:job_queue_processes最大值为1000