一个简单的定时job

因为工作需要,每天半夜定时更新某个字段,就写了一个定时任务调用一个存储过程,都是一些简单的操作。

首先看下存储过程,
create or replace procedure chan_contract_nowork is
begin 
    update BASIC_CONTRACT_LABOR 
    set 
        WHETHER_EFFECTIVE = 'N',
        WHETHER_EFFECTIVE_CHS = '否'
    where CONTRACT_SEQ = '1'
    and to_date(CONTRACT_END_DATE,'yyyy-mm-dd') < to_date(to_char(SYSDATE,'yyyy-mm-dd'),'yyyy-mm-dd');
    commit;
end;  
drop procedure chan_contract_nowork;//附送的删除存储过程的语句
就是一条判断当前日期是否大于结束日期来修改某些字段的简单语句。因为我建表的时候,contract_end_date是varchar2类型,所以要转换成date类型,然后把当前时间转成对应的char类型再装成相应格式的date类型进行比较。
然后看下创建job的语句

declare jobno number;//生成job的id

begin     

    dbms_job.submit(        

                    jobno,  //jobid       

                    'chan_contract_nowork;',  //执行的存储过程 

                    sysdate,  现在执行       

                    'TRUNC(sysdate) + 1 +2 / (24)'  //设置间隔时间      

  );   

commit;

end;

有件好玩的事情是我不知道dbms_job 是 oracle默认某个方法什么的,以为job的名字,然而job 没有名字。然后,注意commit,因为是在job表里插入数据所以,还是一定不能忽略commit的好。
当然如果不设置执行时间为sysdate,现在执行的话,就需要执行语句了。下面附送几条对job的其他操作语句。
1:执行语句
begin
   DBMS_JOB.RUN(40); /*40 job的id*/
 end;
2:删除语句
begin
  /*删除自动执行的job*/
  dbms_job.remove(40);
end;
3:停止语句

dbms.broken(job,broken,nextdate);   
dbms_job.broken(v_job,true,next_date);        /*停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。   */

4.修改间隔时间

dbms_job.interval(job,interval);

5.修改下次执行时间

dbms_job.next_date(job,next_date);

6.修改要执行的操作 

dbms_job.what(jobno,'change_code;');  --修改执行另一个存储过程

还有对job的查询

a:查看执行结果 

select  * from test_job order by test_job.para_date desc;
b: 查看job 
select * from sys.user_jobs
c: 查询是否JOB还在Running,当然job的执行时间不很短
select * from dba_jobs_running

至于job间隔时间的值,我百度的。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值