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的其他方法
这里写图片描述

参考

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值