Каков синтаксис для добавления параметров к вызываемой процедуре в планировщике Oracle? - PullRequest
2 голосов
/ 04 декабря 2011

Скажем, у меня есть 2 процедуры: MYPROC1 и MYPROC2 (A_PARAM INTEGER)

это работает:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
        job_name => 'TEST_SCHEDULER',
        job_type => 'STORED_PROCEDURE',
        job_action => 'developer.MYPROC1', <<<<<<<<<<<<<<<
        start_date => TIMESTAMP'2011-12-4 10:30:00',
                repeat_interval => 'FREQ=SECONDLY;INTERVAL=30',
        end_date => TIMESTAMP'2011-12-4 10:45:00',
        auto_drop => FALSE,
        comments => 'TEST 1');
END;

замена строки 5 на:

job_action => 'developer.MYPROC1(2)' делаетэто не работает.Ошибка: ... неверное имя для объекта базы данных ...

Итак, как мне вызвать из планировщика параметризованную процедуру?Какой синтаксис?

Ответы [ 3 ]

4 голосов
/ 04 декабря 2011

используйте job_type => 'PLSQL_BLOCK', job_action => 'BEGIN developer.MYPROC1(2); END;' вместо.

2 голосов
/ 04 декабря 2011

Оставьте параметр job_action как есть (без аргументов) и добавьте параметр number_of_arguments к числу, если параметры ожидаются вашей процедурой.

Затем вы можете использовать DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE для установки значений аргумента.

Примеры здесь: Использование заданий .

0 голосов
/ 03 апреля 2018
  • Прежде всего, создайте задание планировщика, используя DBMS_SCHEDULER.CREATE_JOB без включения (уже по умолчанию установлено значение false), и затем его следует включить.
  • Приятно определить job_nameпараметр как переменная связывания для последовательных имен заданий.
  • job_name параметр не обязательно должен быть в верхнем регистре, но при запросе истории запуска планировщика вызывайте его со всеми буквами job_name в верхнем регистреиз привилегированной схемы:

    select * 
      from dba_scheduler_job_log l
     where l.job_name = 'TEST_SCHEDULER'
     order by l.log_date desc;
    
  • Не забудьте включить number_of_arguments (для этого случая равно 1) параметр для вашей команды создания задания.

  • Как говорит Мат, вы можете использовать DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE, как в следующем примере (также определите параметр argument value как переменную связывания со значением 2, как в вашем случае):

    BEGIN  
     DBMS_SCHEDULER.CREATE_JOB(
         job_name => '&v_job_name', -- tEst_sCheDuLEr
         job_type => 'STORED_PROCEDURE',
         job_action => 'developer.MYPROC1', 
         number_of_arguments => 1,
         start_date => '04-apr-2018 10:30:00 am',
         repeat_interval => 'FREQ=SECONDLY;INTERVAL=3;',
         end_date => '04-apr-2018 10:45:00 am',
         auto_drop => false,
         comments => 'TEST 1');
    
     DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(
         job_name => '&v_job_name', 
         argument_position => 1,
         argument_value => &vl -- 2
         );
    
     DBMS_SCHEDULER.ENABLE('&v_job_name');    
    END;
    

Если вы получите ORA-01882 Область часового пояса не найдена ошибка, тогда для параметра start_date можно использовать формат

to_timestamp_tz('04-APR-2018 10:30:00 EST', 'DD-MON-YYYY HH24:MI:SS TZR') или to_date('04.04.2018 10:30:00', 'DD.MM.YYYY HH24:MI:SS').

...