怎样创建Oracle的dbms_jobs(数据库任务)

一、业务需求

    在开发项目的过程中,我们需要对某个存储过程(或SQL语句)执行定时任务(比如指定每天的每个时间内执行),这时我们就需要使用到数据库任务(DBMS_JOBS)来实现。

二、实现方法

2.1、查询当前运行的数据库任务语句

--查看当前用户下的数据库执行任务语句
SELECT * FROM  dba_jobs ;

2.2、使用PL/SQL创建dbms_jobs

    选择DBMS_Jobs点击鼠标右键选则【新建】,在What值输入需执行的存储过程名称及其对应参数,在输入时间间隔,最后点击应用即可。

2.3、通过SQL语句创建DBMS_Jobs

--通过SQL创建DBMS_Jobs(模板)
declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => job,  /*自动生成JOB_ID*/  
        WHAT =>'storedProcedureName(Param);',  /*需执行的存储过程名称或SQL语句*/  
        NEXT_DATE => sysdate,  /*初次执行时间(立即执行)*/  
        INTERVAL => 'TRUNC(sysdate+1) + (8.5*60)/ (24 * 60)' /*执行间隔(每隔一天的早上8点半执行)*/
      );  
  commit;
end;


--示例程序(每天早上8:30执行【TESTINUPTOUTPUT】存储过程且指定固定参数为1000)
declare
  job number;
begin
  sys.dbms_job.submit(
	   job => job,
     what => 'declare inputInfo varchar2(50):=''1000'';

begin

TESTINUPTOUTPUT(inputInfo);

end;',
   interval =>  'TRUNC(sysdate+1) + (8.5*60)/ (24 * 60)');
  commit;
end;

2.4、运行DBMS_Jobs的SQL语句

--运行DBMS_JOBS的SQL语句

BEGIN

dbms_job.run(任务编号);

END;

运行dbms_Job示例如下:

2.5、 停止DBMS_Jobs的SQL语句

--手动停止某个DBMS_Job

/*
    格式:dbms_job.broken(jobId,broken,next_date); 
    jobId:定时任务的编号(DBMS_Job)
    broken:值为true时,表示禁用job;值为false时,表示启用job。
    next_date:(某一时刻停止),也可是sysdate(立刻停止)(默认值为sysdate)。
*/
BEGIN
    dbms_job.broken (jobId, TRUE, next_date) ; 
COMMIT ;
END ;

 运行停止DMBS_Job任务示例如下:

 2.6、修改定时任务(DBMS_Jobs)的SQL语句

2.6.1、修改定时任务的执行间隔

--修改定时任务的时间间隔

/*
    jobId:任务的编号
    interval: 任务执行间隔的时间表达式
*/

begin
  dbms_job.interval(jobId,interval);  
  commit;
end;

 运行示例如下:

2.6.2、修改定时任务的下次执行时间

--修改定时任务的下一次执行时间

/*
    jobId:任务的编号
    next_date: 下一次任务执行的时间表达式
*/
begin
   dbms_job.next_date(jobId,next_date); 
   commit;
end;

 运行示例:

2.6.3、修改定时任务要执行的操作(或存储过程)

--修改定时任务要执行的操作

/*
    jobId:任务的编号
    newStoredProcedure: 修改为的新存储过程
*/
begin
    dbms_job.what(jobId,'newProcedures;');   
  commit;
end;

 运行示例如下:

2.7、删除定时任务的SQL语句

--删除定时任务的SQL语句
/*
     Jobid:表示需删除的任务编号
*/

begin
  dbms_job.remove(Jobid);  
  commit;
end;

运行示例如下: 

 三、定时任务的时间间隔说明

定时任务的时间间隔说明
序号 说明 时间间隔表达式
1 时间间隔为1分钟 trunc(sysdate,'mi') + 1/ (24*60) 或 sysdate + 1 / (24 * 60) 
2 时间间隔为1小时  sysdate + 1/24 from 
3 时间间隔为每天凌晨1点  trunc(sysdate+ 1)  +1/ (24) 
4 时间间隔为每周一凌晨1点 trunc(next_day(sysdate,'星期一'))+1/24 
 
5 时间间隔为每月1日凌晨1点 trunc(LAST_DAY(SYSDATE))+1+1/24
6 时间间隔为每季度的第一天凌晨1点 trunc(ADD_MONTHS(SYSDATE,3),'Q') + 1/24
7 时间间隔为每半年定时执行【10月1日和1月1日凌晨1点】  ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24
8 时间间隔为每年定时执行【每年1月1日凌晨1点】

ADD_MONTHS(trunc(sysdate,'yyyy'),12)+1/24

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...