我正在使用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。:可能我犯了错误......对不起我的英语!
答案 0 :(得分:1)
要将参数传递给调度程序,您可以使用如下:
, job_action => 'test_proc(v_aud_date); END;'
答案 1 :(得分: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 :(得分:0)
sysdate
在执行时间进行评估。创建一次调用作业的脚本,以便在创建作业时对date
进行一次评估。
如果您需要sysdate
执行而不是创建时间,只需在正在执行的代码中使用sysdate
,而不是通过参数传递它。在PL / SQL代码的每个位置,您都有sysdate
,因此在test_proc
添加declare curr_time date := sysdate;
并使用curr_time
就位,您将使用以前传递的参数。
您还可以更改过程以使此参数default sysdate
和作业调用完全没有参数。