【问题标题】:How to schedule a work to run at particular time using dbms_scheduler如何使用 dbms_scheduler 安排工作在特定时间运行
【发布时间】:2012-12-10 14:38:22
【问题描述】:

我不清楚这一点,在 DBMS_SCHEDULER 我们有 CREATE_PROGRAM CREATE_JOB CREATE_SCHEDULE 等,在阅读了 oracle 文档后仍然不清楚要使用什么,在 Oracle 方面,我将使用 DBMS_SCHEDULER 将新消息插入在适当的时间排队,我计划创建调度程序以在特定时间执行它,然后创建程序来执行我的 PL/SQL 块,它将消息排入队列中使用哪个?请指导我是否正确,如果不正确,请纠正我。

谢谢

【问题讨论】:

    标签: oracle oracle10g oracle11g advanced-queuing dbms-scheduler


    【解决方案1】:

    create_job 是安排通话的基本通话。您不必创建命名程序或时间表来执行此操作。如果您有多个工作想要使用此调用,则创建命名程序/时间表很有用。您可以只引用指定的程序时间表,而不是让每个作业都保存一份副本。

    例如如果你有 5 个工作想要调用你的包 MYPKG.ENTRY_PROG(param) 并且每个工作只使用不同的参数值,我会说你想使用 create_program 来定义那个 pl/sql 调用,然后 create_job 来引用那个程序name + 设置选择的参数值。这样,如果您想稍后重命名 API 或其他什么,您不必更改五个单独的作业来执行此操作。

    如果您的作业只是一个独立作业,它调用不会被其他作业调用的例程,那么您不必使用create_program/create_schedule,直接使用create_job即可。

    我使用create_program 的一个例子是调用测试工具。我的测试工具包名为pkg_test_harness.queue_tests(p_set_name in varchar2),因此我定义了一些作业,这些作业将各种 API 排入队列,以便在上午 9 点、中午 12 点和下午 5 点运行。我没有单独定义每个作业调用,而是调用了create_program,例如:

        dbms_output.put('Setting up TEST_HARNESS_ENQUEUE scheduler program...');
        dbms_scheduler.create_program(program_name        => 'TEST_HARNESS_ENQUEUE',
                                      program_type        => 'STORED_PROCEDURE',                                                          
                                      program_action      => 'pkg_test_harness.queue_tests', 
                                      number_of_arguments => 1,
                                      enabled             => false,
                                      comments            => 'Program to enqueue a set of API test for the test harness to run.');
    
        dbms_scheduler.define_program_argument(program_name      => 'TEST_HARNESS_ENQUEUE',
                                               argument_name     => 'p_set_name',
                                               argument_position => 1,
                                               argument_type     => 'VARCHAR2',
                                               default_value     => '');
    
        dbms_scheduler.enable (name => 'TEST_HARNESS_ENQUEUE');
    
        dbms_output.put_line('done.');
    

    然后每个“作业”都被定义为指向该程序。

    dbms_output.put('Setting up TEST_HARNESS_ENQUEUE_9AM scheduler job...');
    dbms_scheduler.create_job(job_name        => 'TEST_HARNESS_ENQUEUE_9AM',
                              program_name    => 'TEST_HARNESS_ENQUEUE',
                              start_date      => systimestamp,
                              end_date        => null,
                              repeat_interval => 'freq=daily; byhour=9; byminute=0; bysecond=0;',
                              enabled         => true,
                              auto_drop       => false,
                              comments        => 'Job to enqueue a set of API test for the test harness to run.');
    
    dbms_scheduler.set_job_argument_value(job_name          => 'TEST_HARNESS_ENQUEUE_9AM',
                                          argument_position => 1,
                                          argument_value    => 'DAILY_9AM');
    dbms_output.put_line('done.');
    
    dbms_output.put('Setting up TEST_HARNESS_ENQUEUE_12PM scheduler job...');
    dbms_scheduler.create_job(job_name        => 'TEST_HARNESS_ENQUEUE_12PM',
                              program_name    => 'TEST_HARNESS_ENQUEUE',
                              start_date      => systimestamp,
                              end_date        => null,
                              repeat_interval => 'freq=daily; byhour=12; byminute=0; bysecond=0;',
                              enabled         => true,
                              auto_drop       => false,
                              comments        => 'Job to enqueue a set of API test for the test harness to run.');
    

    我没有创建命名计划,因为这些计划对于单个工作是唯一的。

    【讨论】:

    • 您好,感谢您的回复。请考虑情景。 “多个商户登录门户,并在特定时间配置了交易的结算时间。商户配置的结算时间因商户而异,不是一个固定时间。多个事件或通知必须只能在商家配置的时间生成。1.)在这种情况下,只有 create_job 会帮助我吗?2.)同样的 create_job 也可以被其他商家重复使用对吗?希望我能够解释问题。请回复任何合适的解决方案。
    • @user1 来自您的描述,因为每个商家都在指定自己的时间表,所以是的,不需要命名时间表。但是如果每个商家的 pl/sql proc 相同,那么 create_program + create_job 是要走的路
    • create_job 中有job_type 和job_action 时,create_program 需要做什么?
    • @user1 我把原因放在我原来的答案中。您没有必须使用create_program,如果pl/sql 调用在作业之间共享,这样做可能会更简洁。如果您可以更轻松地将create_jobjob_action 一起使用,那么请务必这样做。
    猜你喜欢
    • 2023-01-09
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 2019-01-28
    • 2016-11-24
    • 2020-09-21
    相关资源
    最近更新 更多