я создал следующую программу и последующую Oracle РАБОТУ:Как создать асинхронную Oracle задание для выполнения в нескольких экземплярах
BEGIN
DBMS_SCHEDULER.create_program (program_name => 'myProg',
program_action => 'myProc',
program_type => 'STORED_PROCEDURE',
number_of_arguments => 3,
enabled => FALSE);
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name => 'myProg',
argument_position => 1,
argument_type => 'NUMBER');
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name => 'myProg',
argument_position => 2,
argument_type => 'NUMBER');
DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT (program_name => 'myProg',
argument_position => 3,
argument_type => 'NUMBER',
DEFAULT_VALUE => NULL);
DBMS_SCHEDULER.create_job ('myJob',
program_name => 'myProg',
enabled => FALSE,
comments => 'Send data');
DBMS_SCHEDULER.SET_ATTRIBUTE ('myJob', 'PARALLEL_INSTANCES', TRUE);
DBMS_SCHEDULER.SET_ATTRIBUTE ('myJob',
'logging_level',
DBMS_SCHEDULER.LOGGING_FULL);
END;
/
Теперь, у меня есть пользователь, который может работать/выполнять работу, которая вызывает следующую процедуру :
PROCEDURE runJOB(param1 IN PLS_INTEGER,
param2 IN PLS_INTEGER DEFAULT NULL,
param3 IN PLS_INTEGER DEFAULT NULL)
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
DBMS_SCHEDULER.enable ('myProg');
DBMS_SCHEDULER.set_job_argument_value ('myJob', 1, TO_CHAR (param1));
DBMS_SCHEDULER.set_job_argument_value ('myJob', 2, TO_CHAR (param2));
DBMS_SCHEDULER.set_job_argument_value ('myJob', 3, TO_CHAR (param3));
--DBMS_SCHEDULER.enable ('myJob');
DBMS_SCHEDULER.RUN_JOB (JOB_NAME => 'myJob', USE_CURRENT_SESSION => FALSE);
--DBMS_SCHEDULER.disable ('myJob');
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (DBMS_UTILITY.FORMAT_ERROR_BACKTRACE);
END runJOB;
В чем мои проблемы?
- Мне нужно запустить работу в асинхронном режиме. Вот почему у меня есть
enable
илиrun_job
с использованием параметраUSE_CURRENT_SESSION
FALSE
. Я думаю, что это работает. - Мне нужно выполнить несколько экземпляров одного и того же задания, начиная с разных пользователей, в то же время. Например, пользователь A вызывает процедуру
runJOB
. Задание может выполняться через 20 секунд. В этом случае 20 секунд пользователь B может вызывать ту же процедуру в другом сеансе. Вот почему я попытался использовать атрибутPARALLEL_INSTANCES
, но Я получаю только одно исполнение. Я думаю, Oracle видит, что работа работает, поэтому отмените вторую попытку запуска.
При возобновлении работы мне необходимо выполнить задание, которое должно выполняться в режиме асинхронного режима и с несколькими экземплярами одновременно.
После «двойной» выполнение задания для двух случаев я получаю только одну запись в таблице user_SCHEDULER_JOB_RUN_DETAILS
, но 2 включить работу для двух разных пользователей (SGSS и EX01882_BD)
52367532 26/12/2016 12:08:44,584878 +00:00 SGSS myJob DEFAULT_JOB_CLASS RUN SUCCEEDED (HugeClob)
52364238 26/12/2016 12:08:36,529539 +00:00 SGSS myJob DEFAULT_JOB_CLASS ENABLE EX01882_BD (HUGECLOB)
52367534 26/12/2016 12:08:34,302807 +00:00 SGSS myJob DEFAULT_JOB_CLASS ENABLE SGSS (HUGECLOB)
Любая помощь?
Примечание: Я не могу иметь различные названия рабочих мест как в этом растворе (How run two or more instances of an oracle job in the same time?), потому что работа уже создана, и пользователи, которые называют эту работу, не имеют права на создание.
Спасибо, но с использованием FALSE что, который я уже сообщал. Мне нужно запустить новый экземпляр задания, даже если работает другой экземпляр. Позвольте мне попробовать значение TRUE с небольшим изменением здесь. – milheiros
Если я использую TRUE, я не могу выполнить выполнение асинхронного задания. С FALSE Я не могу иметь несколько исполнений одного и того же задания – milheiros
Да, если вам действительно нужно выполнить параллельное выполнение, вы должны прочитать о очередях (например: https://oracle-base.com/articles/10g/scheduler-enhancements-10gr2) – Stawros