Oracle-job 创建定时任务

需求

假如我有一个用来汇总话费的存储过程,我希望每天凌晨执行一次以保证每次看到的话费都是接近于实时话费的,这个过程叫HFHZ,结构如下:

CREATE OR REPLACE PROCEDURE "HFHZ"
(
  QueryStr IN VARCHAR2,
  v_1 OUT SYS_REFCURSOR
)
IS
...

方案

使用Oracle提供的job来定时执行。

步骤

1.创建一个日志表

create table log_auto_hz(dtime date,querystr VARCHAR2(100));
Select * From log_auto_hz;

2.创建一个存储过程

create or replace procedure p_auto_hz AS
/***********************
function:记录自动汇总日志
params:
    v_hzyf,默认为当月,如20161223日,那么值为201612
    v_querystr,v_cur 存储过程hfhz的参数
createDate:2016.12.23
author:yw
*******************/
v_hzyf VARCHAR2(10);
v_querystr VARCHAR2(100);
v_cur sys_refcursor;
begin
 select to_char(sysdate,'yyyymm') into v_hzyf from dual;--根据系统时间来取参数
 v_querystr = 'language=zh;UserID=admin;ds=tsdBilling;tsdExeType=query;tsdpname=hfhz.Hz;Hzyf='||v_hzyf||';';
 --参数准备完毕,执行目标存储过程
 hfhz(v_querystr,v_cur);
 --根据不同的返回结果插入不同内容的日志
 IF v_cur IS NOT NULL THEN
          insert into log_auto_hz values(sysdate,v_querystr);
          ELSE 
          insert into log_auto_hz values(sysdate,'汇总出错~');
      END IF;
end;

3.创建一个执行计划:每天凌晨3:30执行自动汇总

Declare 
  i Integer;
Begin
   dbms_job.submit(i,'p_auto_hz;',Sysdate,'TRUNC(SYSDATE+1)+(3*60+30)/(24*60)');
end;

4.查看已经创建的所有执行计划

Select * From user_jobs;

5.运行执行计划

Declare 
  job_num Integer;
Begin
 -- 查找计划号
 Select t.JOB Into job_num From User_Jobs t ;
 -- 运行制定的执行计划,比如我的计划号是22
 dbms_job.run(22);
end;

6.查看计划的运行结果

select  * from log_auto_hz t Order By t.dtime;

7.dbms_job的其他方法
Oracle-job 创建定时任务_第1张图片

参考

1、oracle job 定时执行 存储过程
2、Oracle中job的使用详解

你可能感兴趣的:(oracle)