Oracle DBMS_SCHEDULER sysdate参数

时间:2016-12-15 08:49:05

标签: oracle plsql

我正在使用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。:可能我犯了错误......对不起我的英语!

3 个答案:

答案 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和作业调用完全没有参数。