Oracle DBMS_SCHEDULER sysdate 参数
Posted
技术标签:
【中文标题】Oracle DBMS_SCHEDULER sysdate 参数【英文标题】:Oracle DBMS_SCHEDULER sysdate argument 【发布时间】:2016-12-15 08:49:05 【问题描述】:我正在使用 Oracle12c。我正在使用 DBMS_SCHEDULER 每分钟执行一个过程。我想在每次执行中使用当前日期时间 (SYSDATE) 向此过程传递一个参数。
但是当我创建作业时,这个参数只会被评估一次。然后,在每次连续执行中,参数的值始终相同(创建作业日期)。
-- procedure signature
test_proc(v_aud_date in date);
-- scheduler_job
begin
dbms_scheduler.create_job (
job_name => 'test_JOB'
, job_type => 'STORED_PROCEDURE'
, job_action => 'test_proc'
, number_of_arguments => 1
, start_date => SYSTIMESTAMP
, repeat_interval => 'freq=minutely; interval=1;'
);
dbms_scheduler.set_job_anydata_value(
job_name => 'test_JOB'
, argument_position => 1
, argument_value => sys.anydata.convertDate(sysdate)
);
dbms_scheduler.enable('test_JOB');
end;
我想为每次执行获取当前的 SYSDATE。我不能改变程序。对我来说是一个黑匣子。
DBMS_SCHEDULER 可以吗?
P.S.:可能我犯了错误...对不起我的英语!
【问题讨论】:
我想这可以帮助Passing arguments to oracle stored procedure through scheduler job 【参考方案1】:您可以将作业创建为 PL/SQL 块,如下所示:
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'test_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN test_proc(sysdate); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'freq=minutely; interval=1';
enabled => TRUE,
comments => 'Test job');
END;
/
【讨论】:
【参考方案2】:要将参数传递给调度程序,您可以使用如下方式:
, job_action => 'test_proc(v_aud_date); END;'
【讨论】:
【参考方案3】:sysdate
在执行时间上进行评估。创建您调用一次的作业的脚本,因此该date
在创建作业时被评估一次。
如果您在执行而不是创建时需要sysdate
,只需在您正在执行的代码中使用sysdate
,而不是通过参数传递它。在 PL/SQL 代码的每个地方都有sysdate
so 在test_proc
添加declare curr_time date := sysdate;
并使用curr_time
在您将使用先前传递的参数的地方。
您还可以更改程序以具有此参数 default sysdate
并在完全不带参数的作业调用中。
【讨论】:
以上是关于Oracle DBMS_SCHEDULER sysdate 参数的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Oracle 中使用 DBMS_SCHEDULER 删除文件
Oracle DBMS_SCHEDULER sysdate 参数
Oracle DBMS_Scheduler 每天上午 9:10 和 11:30 运行 DBMS_JOB