【问题标题】:create oracle job run procedure with parameters once一次创建带参数的 oracle 作业运行过程
【发布时间】:2021-06-19 04:06:17
【问题描述】:

我想在特定日期和时间创建仅在该日期和时间运行一次的 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;

【问题讨论】:

    标签: oracle stored-procedures plsql job-scheduling dbms-scheduler


    【解决方案1】:

    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,
                                              argument_type       => 'NUMBER',
                                              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;
    

    【讨论】:

    • 它显示错误:ORA-27465: 属性 ARGUMENT_POSITION 的值 1 无效
    • 添加参数个数属性后生效
    • 非常感谢您。
    【解决方案2】:

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

    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'
    

    如果这不能满足您的要求(尤其是那些试图包含某种参数的尝试,请更详细地说明您试图用它们实现什么。

    【讨论】:

    • 感谢您的回复,我尝试了您的代码,但出现了此错误(ORA-27452:“send_Schedule_reminders(1,2)”是数据库对象的无效名称。)
    • 我从您的 pl/sql 块中获取了它。那么您要执行的过程的名称(和所有者)是什么? SELECT OWNER, OBJECT_NAME, OBJECT_TYPE FROM DBA_OBJECTS WHERE UPPER(OBJECT_NAME)='SEND_SCHEDULE_REMINDERS';或者使用您原来的 job_action 并将 job_type 更改为“PLSQL_BLOCK”。您应该查看 dbms_scheduler.create_job 上的文档,地址为 docs.oracle.com/en/database/oracle/oracle-database/18/arpls/…,特别注意 job_type 和 job_action。
    猜你喜欢
    • 2015-10-19
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2019-09-20
    • 2021-06-16
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多