Oracle

將參數傳遞給由 DBMS_SCHEDULER 執行的過程

  • March 22, 2022

我有一個調度程序,它執行一個需要輸入參數的儲存過程。

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_ARGUMENTprocedure定義程序的參數(如果有的話) :

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

在這裡,我們定義了程序參數及其預設值。我們可以不指定預設值,但在這種情況下,我們必須使用SET_JOB_ARGUMENT_VALUEprocedure設置參數的值。例如,如果您創建了作業並指定了關聯的程序,如下所示:

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

  1. 創建另一個過程並在其中傳遞參數
  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;

引用自:https://dba.stackexchange.com/questions/42119