背景:项目表中有个结束日期的字段,需要根据这个字段,把大于当前日期的其他字段参数给更新为空;
查询sql: select id from uf_accountrem where sj<to_char(sysdate,'yyyy-mm-dd');
创建存储过程示例:
create or replace procedure t_gxkwxt is
cursor vid is
select id from uf_accountrem where sj<to_char(sysdate,'yyyy-mm-dd');
---cursor是显示游标,创建显示游标vid,赋予值为select的内容;
begin
for row_b in vid loop
----for为循环游标,执行游标内容
update uf_accountrem set BLYX='',bz='',sj='' where id in(row_b.id);
end loop;
commit;
end;
尝试在plsql测试存储过程,确认存储过程是否正常运行;
确认正常后,创建job定时任务,(dbms_job与dbms_scheduler有着oracle版本上的区别,oracle11G以上建议是使用dbms_scheduler方法)
----begin为开始头,end为结束
begin
DBMS_SCHEDULER.CREATE_JOB (
job_name => 't_gxkwxt_job' , --定义定时任务的名称
job_type => 'STORED_PROCEDURE' , --指执行的任务类型,STORED_PROCEDURE=存储过程;
job_action => 't_gxkwxt' , ---存储过程的名称,需和创建的存储过程名称保持一致;
start_date => sysdate, ---开始执行的时间,可自定义,我这里取的是当前时间;
Repeat_Interval => 'FREQ=DAILY;BYHOUR=13', ---设置计划任务的时间。具体任务类型可以参考下面描述
Enabled => True ---状态 true=启动
);
End ;
查看定时任务的是否创建和执行情况
select job_name,job_type,enabled,state from user_scheduler_jobs
select * from user_scheduler_job_run_details where job_name='T_GXKWXT_JOB'
定时任务的参数说明
job_name : 必选, 任务名称
job_type : 必选, 任务类型(
PLSQL_BLOCK, -- 执行一个PL/SQL匿名快
STORED_PROCEDURE, -- 执行一个存储过程
EXECUTABLE, -- 执行一个外部程序
CHAIN -- 执行一个CHAIN
)
job_action : 必选, 任务内容, 与job_type配合使用
start_date : 可选, 首次执行时间, 为空时表示立即执行
repeat_interval : 可选, 执行频率, 为空时表示只执行一次(
FREQ=MINUTELY; -- 表示间隔单位, 可选值有YEARLY, MONTHLY, WEEKLY, DAILY, HOURLY, MINUTELY, SECONDLY
INTERVAL=1 -- 表示间隔周期
)
enabled : 可选, 是否启用任务
repeat_interval的参数描述补充
YEARLY(年), MONTHLY(月), WEEKLY(周), DAILY(日), HOURLY(时), MINUTELY(分), SECONDLY(秒)等单位。
INTERVAL 关键字用来指定间隔的频繁,可指定的值的范围从1-999。
BYHOUR 指定一天中的小时。可指定的值的范围从1-24。16,17,18就表示天天下午的四、五、6点。
BYDAY 关键字用来指定每周的哪天运行。
BYMINUTE 关键字用来指定分钟,要配合BYDATE使用,50,表示某个时刻的50分。
BYMONTHDAY 关键字用来指定每个月中的哪一天。-1 表示每个月最后一天。
BYMONTH 关键字用来指定每一年的月份。
BYDATE 指定日期。0310就表示3月10日。