需求
假如我有一个用来汇总话费的存储过程,我希望每天凌晨执行一次以保证每次看到的话费都是接近于实时话费的,这个过程叫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,默认为当月,如2016年12月23日,那么值为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的其他方法