2016-12-15 6 views
1

私はOracle12cを使用しています。 DBMS_SCHEDULERを使用して毎分プロシージャを実行しています。私は、各実行で現在の日時(SYSDATE)でこのプロシージャに1つの引数を渡します。Oracle DBMS_SCHEDULER sysdate引数

しかし、この引数は、ジョブを作成するときに1回だけ評価されます。その後、連続して実行されるたびに、引き数の値は常に同じになります(ジョブの作成日)。

-- 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 .:おそらく私は間違いを犯しました...私の英語は申し訳ありません!

+0

私はこれができたと思いますhelp [スケジューラ・ジョブを介してoracleストアド・プロシージャに引数を渡す](http://stackoverflow.com/questions/9179775/passing-arguments-to-oracle-stored-procedure-through-scheduler-job) – Leo

答えて

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; 
/
0

sysdateは、実行時に評価されます。一度呼び出すジョブを作成するスクリプト。dateは、作成されたジョブで一度評価されます。 実行中のsysdateが作成されていない場合は、実行中のコードの中でsysdateを使用するだけで、パラメータを渡すことはありません。 PL/SQLコードのすべての場所にsysdateがありますので、test_procにはdeclare curr_time date := sysdate;を追加し、先に渡されたパラメータを使用する場所にはcurr_timeを使用してください。
また、このパラメータをdefault sysdateに設定し、パラメータなしのジョブ・コールでプロシージャを変更することもできます。あなたは以下のように使用することができスケジューラに引数を渡すために

1

, job_action   => 'test_proc(v_aud_date); END;' 
関連する問題