因为工作需要,每天半夜定时更新某个字段,就写了一个定时任务调用一个存储过程,都是一些简单的操作。
首先看下存储过程,
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;'); --修改执行另一个存储过程
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间隔时间的值,我百度的。