一次创建带参数的 oracle 作业运行过程

问题描述

我想在特定日期和时间创建仅在该日期和时间运行一次的 oracle 作业 然后自动掉线。

该作业还应运行带有 2 个参数的过程。

注意:l_id 我使用这个变量在过程名称旁边添加数字以避免任何形式的重复。

P94_DATE:用户将选择日期和时间并将其存储在该变量中。

这里是我到目前为止发现的,但是当我运行它时,它给了我“语句继续”但是当我检查作业是否在“sys.all_scheduler_jobs”上成功创建时 它不存在。

dbms_scheduler.create_job (
job_name           =>  'eba_sb_reminder_s'||l_id,job_type           =>  'STORED_PROCEDURE',job_action         =>  'BEGIN send_Schedule_reminders(1,2); END;',start_date         =>  :P94_DATE,-- I need to assign time also !!
 enabled            =>  true,comments           => 'check if there is new reminders needs to be send in specific date and time'


 );
end;

解决方法

job_type 设置为 STORE_PROCEDURE 时,您必须在 job_action 中指定过程的名称。

参数 start_date 的类型为 DATE,它在 Oracle 中也有时间。您只需要使用正确的值设置 :p94_date,其中包含日期和时间部分。

如果过程有参数,则需要使用DBMS_SCHEDULER.set_job_argument_value来指定参数值。

编辑:修改样本

示例:

BEGIN
   -- This needs to be configured just once.
   DBMS_SCHEDULER.create_program(program_name          => 'test_program',program_type          => 'STORED_PROCEDURE',program_action        => 'test',number_of_arguments   => 2,enabled               => FALSE,comments              => 'Comment');

   DBMS_SCHEDULER.define_program_argument(program_name        => 'test_program',argument_name       => 'p1',argument_position   => 1,argument_type       => 'NUMBER',DEFAULT_VALUE       => NULL);

   DBMS_SCHEDULER.define_program_argument(program_name        => 'test_program',argument_name       => 'p2',argument_position   => 2,DEFAULT_VALUE       => NULL);

   DBMS_SCHEDULER.enable(name => 'test_program');

   -- Create job
   DBMS_SCHEDULER.create_job(
      job_name       => 'test_job',program_name   => 'test_program',start_date     => :p94_date,enabled        => FALSE,comments       => 'check if there is new reminders needs to be send in specific date and time');

   -- Set Procedure Parameter
   DBMS_SCHEDULER.set_job_argument_value(job_name => 'test_job',argument_position => 1,argument_value => 1);
   DBMS_SCHEDULER.set_job_argument_value(job_name => 'test_job',argument_position => 2,argument_value => 2);

   -- Enable job
   DBMS_SCHEDULER.enable(name => 'test_job');
END;
,

“它不工作”没有找到任何错误消息参考,并且完全没有可操作的信息。 那就是:

  1. 您将 JOB_TYPE 指定为 STORED_PROCEDURE,因此 JOB_ACTION 应该是存储过程的名称。相反,你给它一个匿名块的代码。

  2. JOB_NAME 包含似乎试图包含变量的字符串连接。该值从何而来,您认为在执行此 CREATE_JOB 时它是如何填充的?

3)START_DATE 似乎也试图包含一个变量/参数。同样,该值从何而来,您认为在执行此 CREATE_JOB 时它是如何填充的?

dbms_scheduler.create_job (
job_name           =>  'eba_sb_reminder_s',job_type           =>  'STORED_PROCEDURE',job_action         =>  'send_Schedule_reminders(1,2)',start_date         =>  to_date('2021-03-22 13:00:00','yyyy-mm-dd hh24:mi:ss'),enabled            =>  true,comments           => 'check if there is new reminders needs to be send in specific date and time'

如果这不能满足您的要求(尤其是那些尝试包含某种参数的尝试,请更详细地解释您要使用它们实现的目标。