Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment programmer un travail pour qu'il s'exécute à un moment particulier à l'aide de dbms_scheduler

create_job est l'appel de base pour programmer un appel. vous n'avez pas besoin de créer un programme nommé ou une planification pour ce faire. où la création d'un programme/planning nommé est utile, c'est si vous avez plusieurs tâches qui souhaitent utiliser cet appel. vous pouvez simplement référencer le programme nommé au lieu d'en avoir une copie pour chaque travail.

par exemple. si vous aviez 5 jobs voulant appeler votre package MYPKG.ENTRY_PROG(param) et chaque travail vient d'utiliser une valeur de paramètre différente, je dirais que vous voulez utiliser create_program pour définir cet appel pl/sql puis create_job pour référencer ce nom de programme + définissez la valeur de paramètre de votre choix. de cette façon, si vous souhaitez renommer l'API ultérieurement ou quelque chose du genre, vous n'avez pas besoin de modifier cinq tâches distinctes pour ce faire.

Si votre tâche est juste une tâche autonome qui appelle une routine qui ne sera pas appelée par d'autres tâches, vous n'avez pas besoin d'utiliser create_program /create_schedule , utilisez simplement create_job directement.

un exemple où j'ai utilisé create_program était d'appeler un harnais de test. mon package de harnais de test s'appelle pkg_test_harness.queue_tests(p_set_name in varchar2) j'ai donc défini quelques tâches qui mettent en file d'attente diverses API à exécuter à 9h00, 12h00 et 17h00. au lieu de définir chaque appel de travail séparément, j'ai juste appelé create_program comme :

    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.');

puis chaque "travail" a été défini pointant vers le programme.

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.');

Je n'ai pas créé d'horaire nommé, car ces horaires sont propres à chaque travail.