oracle - 如何使用 dbms_scheduler 安排工作在特定时间运行

标签 oracle oracle10g oracle11g advanced-queuing dbms-scheduler

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

谢谢

最佳答案

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

例如如果您有 5 个作业想要调用您的包 MYPKG.ENTRY_PROG(param) 并且每个作业仅使用不同的参数值,我会说您希望使用 create_program 来定义该 pl/sql 调用,然后使用 create_job 引用该程序名称并设置所选的参数值。这样,如果您想稍后重命名 API 或进行其他操作,则无需更改 5 个单独的作业来执行此操作。

如果您的作业只是一个独立的作业,它调用不会被其他作业调用的例程,那么您不必使用 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.');

我没有创建命名计划,因为这些计划对于各个作业来说是唯一的。

关于oracle - 如何使用 dbms_scheduler 安排工作在特定时间运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14016842/

相关文章:

oracle - 如何在oracle 11g中创建一个干净的没有多余表的oracle数据库

oracle - 表、模式、表空间和用户之间的字面区别

oracle - Oracle 中的一个实例与多个实例

SQL 连接和输出格式

sql - Oracle:将(合并)一些计数到单行上?

sql - 如何使用UTF_FILE Oracle从CSV文件中分割数据

c# - 为什么 SqlQuery 比在 View 上使用 LINQ 表达式快很多?

database - Oracle v$session,v$mystat 给出错误 : table or view does not exist on select

performance - dbms_output.put_line

sql - 如何在 Oracle PLSQL 中将数字的小数位数扩展到最少?