web-dev-qa-db-ja.com

DBMS_SCHEDULERによって実行されるプロシージャにパラメータを渡す

入力パラメーターを必要とするストアード・プロシージャーを実行するスケジューラー・プログラムがあります。

BEGIN
  DBMS_SCHEDULER.DROP_PROGRAM
    (program_name          => 'MYSCHEMA.EXPORT_SCHEMA_STARTING');
END;
/
BEGIN
  SYS.DBMS_SCHEDULER.CREATE_PROGRAM
    (
      program_name         => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'
     ,program_type         => 'STORED_PROCEDURE'
     ,program_action       => 'MYSCHEMA.EXPORT_STATUS'
     ,number_of_arguments  => 0
     ,enabled              => FALSE
     ,comments             => NULL
    );

  SYS.DBMS_SCHEDULER.ENABLE
    (name                  => 'MYSCHEMA.EXPORT_SCHEMA_STARTING');
END;
/

パラメータをEXPORT_STATUSプロシージャに渡すにはどうすればよいですか?

これを、PL/SQL BLOCKを実行するプログラムに変更しました。

BEGIN
  SYS.DBMS_SCHEDULER.CREATE_PROGRAM
    (
      program_name         => 'MYSCHEMA.EXPORT_SCHEMA_STARTING'
     ,program_type         => 'PLSQL_BLOCK'
     ,program_action       => 'MYSCHEMA.EXPORT_STATUS(''STARTING''); END;'
     ,number_of_arguments  => 0
     ,enabled              => FALSE
     ,comments             => NULL
    );

  SYS.DBMS_SCHEDULER.ENABLE
    (name                  => 'MYSCHEMA.EXPORT_SCHEMA_STARTING');
END;
/

期待通りに動きます。しかし、誰かがそれを以前の形式に保つ方法を知っているなら、感謝されます。

CREATE_PROGRAMプロシージャ を使用してプログラムを作成する場合、number_of_argumentsパラメータを使用して、引数がいくつ必要かを指定できます。

何らかの理由で、既存のスケジューラオブジェクト(この場合はプログラム)の属性(この場合はnumber_of_arguments)を変更する場合、オブジェクトを削除して新しいオブジェクトで再作成する必要はありません。属性値も、代わりに SET_ATTRIBUTEプロシージャ を使用できます。

  dbms_scheduler.set_attribute(
      name => 'my_program'
    , attribute => 'number_of_arguments'
    , value => 1);

プログラムを作成し、そのすべての属性を設定したら、プログラムの引数(ある場合)を DEFINE_PROGRAM_ARGUMENT procedure で定義できます。

dbms_scheduler.define_program_argument(
    program_name => 'my_program'
  , argument_position => 1
  , argument_type => 'VARCHAR2'
  , default_value => 'STARTING'
);

ここでは、プログラムの引数とそのデフォルト値を定義しました。デフォルト値を指定しないでおくこともできますが、この場合は SET_JOB_ARGUMENT_VALUE procedure を使用して引数の値を設定する必要があります。たとえば、ジョブを作成し、関連するプログラムを次のように指定したとします。

dbms_scheduler.create_job(
    job_name => 'call_my_program'
  , program_name => 'my_program'
  ...
);

次のように、ジョブに関連付けられたプログラムで引数の値を設定する必要があります。

dbms_scheduler.set_job_argument_value(
    job_name => 'call_my_program'
  , argument_position => 1
  , argument_value => 'STARTING');

DEFINE_PROGRAM_ARGUMENTプロシージャを使用してプログラムの引数のデフォルト値を定義し、SET_JOB_ARGUMENT_VALUEプロシージャを使用して引数の値を設定した場合、SET_JOB_ARGUMENT_VALUEプロシージャを使用して設定された引数値は、 DEFINE_PROGRAM_ARGUMENTプロシージャで設定されたデフォルトの引数値。

5
  1. 上記の手順をcreareジョブでスケジュールする
  2. CREATE OR REPLACE PROCEDURE XX_COPY_SALES_ORDER IS RETCD NUMBER; RETBUFF VARCHAR2(100); BEGIN XX_PROCESS_PKG.MAIN (RETCD,RETBUFF,NULL); END;
BEGIN
 DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'XX_COPY_SALES_ORDER',
   job_type           =>  'STORED_PROCEDURE',
   job_action         =>  'XX_COPY_SALES_ORDER',
   start_date         =>  '07-MAY-16 07.00.00 PM US/Central',
   repeat_interval    =>  'FREQ=DAILY;INTERVAL=1', /* every other day */
   end_date           =>  '05-OCT-25 07.00.00 PM US/Central',
   auto_drop          =>   FALSE,
  --job_class          =>  'batch_update_jobs',
  enabled             => TRUE,
  comments           =>  'COMMETNS');
END;
0
pankaj singh