如何实现DBMS_SCHEDULER作业每次运行时自动递增日期参数
问题根源
你使用的SET_JOB_ANYDATA_VALUE是作业配置阶段一次性计算参数值并固化的接口,只会在你调用这个配置代码时计算一次表达式结果,不会在作业每次运行时重新动态计算,所以所有作业实例拿到的都是配置时生成的固定值,自然不会自动递增。
可行解决方案
推荐优先用前两种方案,实现更简单,无额外维护成本:
方案1:修改存储过程逻辑,移除日期入参,内部动态计算报表日期
你需要的日期偏移规则是固定的,直接在存储过程内部计算即可,不用通过作业传参:CREATE OR REPLACE PROCEDURE 你的原存储过程名 AS v_report_date DATE; BEGIN -- 按你的规则计算:首次作业运行日为2020-09-01,对应报表日为2021-08-31,直接替换成你的实际偏移逻辑即可 v_report_date := trunc(sysdate) - to_date('01-SEP-2020','dd-MON-yyyy') + to_date('31-AUG-2021','dd-MON-yyyy'); -- 后续保留你原本的业务逻辑即可 END; /之后作业直接调用这个无参存储过程,不需要配置任何参数即可实现自动按天递增。
方案2:不想修改原存储过程的话,调整作业动作为匿名块,动态计算参数后调用
不用修改原有存储过程,只需要调整作业的job_action属性为匿名块即可:DECLARE v_report_date DATE; BEGIN -- 按你的规则计算报表日期 v_report_date := trunc(sysdate) - to_date('01-SEP-2020','dd-MON-yyyy') + to_date('31-AUG-2021','dd-MON-yyyy'); -- 调用原有带参存储过程 你的原存储过程名(v_report_date); END;方案3:必须保留作业参数配置的场景,配置作业前置过程动态更新参数
先创建一个专门更新作业参数的存储过程:CREATE OR REPLACE PROCEDURE update_job_date_param(p_job_name VARCHAR2) AS BEGIN DBMS_SCHEDULER.SET_JOB_ANYDATA_VALUE( job_name => p_job_name, argument_position => 1, argument_value => sys.anydata.convertDate(trunc(sysdate)- to_date('01-SEP-2020','dd-MON-yyyy') + to_date('31-AUG-2021','dd-MON-yyyy')) ); END; /再给你的目标作业绑定前置过程,每次运行前自动更新参数:
BEGIN DBMS_SCHEDULER.SET_ATTRIBUTE( name => '你的作业名', attribute => 'PRE_JOB_PROCEDURE', value => 'update_job_date_param' ); END; /
内容的提问来源于stack exchange,提问作者CLB_LL
相关产品推荐
相关产品推荐

