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 代码的每个地方都有sysdateso 在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

DBMS_SCHEDULER 下次运行日期

带有 OUT 参数调用的 Oracle DBMS_SCHEDULER.create_job

如何在Oracle中管理计划任务