将参数传递给由 DBMS_SCHEDULER 执行的过程

Her*_*ing 4 oracle oracle-11g plsql jobs

我有一个调度程序,它运行一个需要输入参数的存储过程。

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;
/
Run Code Online (Sandbox Code Playgroud)

如何将参数传递给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;
/
Run Code Online (Sandbox Code Playgroud)

它按我的预期工作。但是,如果有人知道如何将其保留为以前的格式,我们将不胜感激。

Yas*_*irA 5

当您使用CREATE_PROGRAMprocedure创建程序时,您可以使用number_of_argumentsparameter指定它期望的参数数量。

如果出于某种原因,您想修改number_of_arguments现有 Scheduler 对象(在我们的示例中为程序)的某些属性(在我们的示例中),则无需删除该对象并再次使用新的属性值重新创建它,您可以只使用SET_ATTRIBUTE程序代替:

  dbms_scheduler.set_attribute(
      name => 'my_program'
    , attribute => 'number_of_arguments'
    , value => 1);
Run Code Online (Sandbox Code Playgroud)

创建程序并设置其所有属性后,您可以使用DEFINE_PROGRAM_ARGUMENTprocedure定义程序的参数(如果有):

dbms_scheduler.define_program_argument(
    program_name => 'my_program'
  , argument_position => 1
  , argument_type => 'VARCHAR2'
  , default_value => 'STARTING'
);
Run Code Online (Sandbox Code Playgroud)

在这里,我们定义了程序参数及其默认值。我们可以不指定默认值,但在这种情况下,我们必须使用SET_JOB_ARGUMENT_VALUEprocedure设置参数的值。例如,如果您创建了作业并按如下方式指定了关联程序:

dbms_scheduler.create_job(
    job_name => 'call_my_program'
  , program_name => 'my_program'
  ...
);
Run Code Online (Sandbox Code Playgroud)

您必须以这种方式在与作业关联的程序中设置参数的值:

dbms_scheduler.set_job_argument_value(
    job_name => 'call_my_program'
  , argument_position => 1
  , argument_value => 'STARTING');
Run Code Online (Sandbox Code Playgroud)

如果您已经为带有DEFINE_PROGRAM_ARGUMENT过程的程序定义了参数的默认值,并且还使用过程设置了参数的值,则使用SET_JOB_ARGUMENT_VALUE过程设置的参数值SET_JOB_ARGUMENT_VALUE将覆盖使用过程设置的默认参数值DEFINE_PROGRAM_ARGUMENT