как сделать dbms_scheduler.create_job настраиваемым? - PullRequest
0 голосов
/ 28 февраля 2019

Вместо того, чтобы жестко кодировать значения dbms_scheduler.create_job repaeat_interval, я хотел бы сделать его настраиваемым.Поэтому я создал новую таблицу, которая позволяет настроить repeat_interval из задания.

В приведенной ниже процедуре в качестве входных параметров используется столбец:

    PROCEDURE scheduled_job IS
      v_start_date swpurge_job_config.start_date%TYPE;
      v_freq       swpurge_job_config.freq%TYPE;
      v_byday      swpurge_job_config.byday%TYPE;
      v_byhour     swpurge_job_config.byhour%TYPE;
      v_byminute   swpurge_job_config.byminute%TYPE;
      v_bysecond   swpurge_job_config.bysecond%TYPE;
      v_end_date   swpurge_job_config.end_date%TYPE;
   BEGIN
      SELECT start_date
            ,freq
            ,byday
            ,byhour
            ,byminute
            ,bysecond
            ,end_date
        INTO v_start_date
            ,v_freq
            ,v_byday
            ,v_byhour
            ,v_byminute
            ,v_bysecond
            ,v_end_date
        FROM swpurge_job_config;
      dbms_scheduler.create_job(job_name        => 'Purge_MW_Log_Data'
                               ,job_type        => 'STORED_PROCEDURE'
                               ,job_action      => 'DBA_UTILS_OWNER.PURGE_TABLES'
                               ,start_date      => 'SYSTIMESTAMP'
                               ,repeat_interval => 'freq' || '=' ||
                                                   v_freq || '; ' ||
                                                   'byday' || '=' ||
                                                   v_byday || '; ' ||
                                                   'byhour' || '=' ||
                                                   v_byhour || '; ' ||
                                                   'byminute' || '=' ||
                                                   v_byminute || '; ' ||
                                                   'bysecond' || '=' ||
                                                   v_bysecond || ';'
                               ,end_date        => NULL
                               ,enabled         => TRUE
                               ,auto_drop       => FALSE
                               ,comments        => 'runs weekly and looks for partitions that needs to be purged');

   END scheduled_job;

Не уверен, как это еще сделать.Любая помощь приветствуется.

сообщения об ошибках:

ORA-01858: не числовой символ был найден там, где ожидалось число ORA-06512: в "DBA_UTILS_OWNER.SWPURGE", строка 450> "dbms_scheduler.create_job (job_name => 'Purge_MW_Log_Data'"

1 Ответ

0 голосов
/ 01 марта 2019
DECLARE
   PROCEDURE scheduled_job IS
      v_start_date swpurge_job_config.start_date%TYPE;
      v_freq       swpurge_job_config.freq%TYPE;
      v_byday      swpurge_job_config.byday%TYPE;
      v_byhour     swpurge_job_config.byhour%TYPE;
      v_byminute   swpurge_job_config.byminute%TYPE;
      v_bysecond   swpurge_job_config.bysecond%TYPE;
      --v_end_date   swpurge_job_config.end_date%TYPE;
   BEGIN
      SELECT start_date
            ,freq
            ,byday
            ,byhour
            ,byminute
            ,bysecond
           -- ,end_date
        INTO v_start_date
            ,v_freq
            ,v_byday
            ,v_byhour
            ,v_byminute
            ,v_bysecond
         --   ,v_end_date
        FROM swpurge_job_config;
      dbms_scheduler.create_job(job_name        => 'Purge_MW_Log_Data'
                               ,job_type        => 'STORED_PROCEDURE'
                               ,job_action      => 'OWNER.PROCEDURE'
                               ,start_date      => v_start_date
                               ,repeat_interval => 'freq' || '=' ||
                                                   v_freq || '; ' ||
                                                   'byday' || '=' ||
                                                   v_byday || '; ' ||
                                                   'byhour' || '=' ||
                                                   v_byhour || '; ' ||
                                                   'byminute' || '=' ||
                                                   v_byminute || '; ' ||
                                                   'bysecond' || '=' ||
                                                   v_bysecond || ';'
                               ,end_date        => NULL
                               ,enabled         => TRUE
                               ,auto_drop       => FALSE
                               ,comments        => 'something');

   END scheduled_job;

BEGIN

   scheduled_job();
END;
/

Проблема заключалась в одинарных кавычках вокруг start_date.Еще одна важная вещь, на которую следует обратить внимание, это то, что v_end_date не может быть проанализирован как параметр в dbms_scheduler (не уверен почему), однако, для меня этого достаточно.

...