Создание задания DBMS_SCHEDULER для оракула

Пытаясь создать работу, но не могу скомпилировать, я получаю эту ошибку. Есть вопрос на форумах оракула, он говорит, что я должен создать программу, чтобы обернуть это. Есть ли обходной путь для этого?

Это дает мне эту ошибку

 -- Created on 30.09.2014 by ALI.ORHAN 
    declare
      -- Local variables here
      i integer;
    begin
      -- Test statements here
      dbms_scheduler.create_job(job_name        => 'blabla'
                               ,job_type        => 'STORED_PROCEDURE'
                               ,job_action      => 'dingdongprocedure;'
                               ,start_date      => '30-OCT-14 10.00.00 PM'
                               ,end_date        => '15-JULY-08'
                               ,repeat_interval => 'FREQ=WEEKLY BYDAY=TUE,FRI BYHOUR=10,13'
                               ,enable          => 'TRUE'
                               ,comments        => 'SUPREME COMMENT');
    end;

После того, как я создал работу из PL/SQL Developer UI, я обнаружил ошибки синтаксиса, новый код приведен ниже;

  1. я использую sys.dbms_scheduler.create_job вместо dbms_scheduler.create_job. Я не знаю различий, но это не главное изменение.
  2. я использовал to_date, чтобы определить start_date, как новичок, я нашел эту лучшую практику.
  3. Важно! Я добавил параметр job_class в 'DBMS_JOB$'. DBMS_JOB является встроенным классом заданий СУБД Oracle. Таким образом, вы найдете все вакансии с этим запросом:

    select * from  ALL_SCHEDULER_JOBS WHERE JOB_CLASS='DBMS_JOB$'
    
  4. Важно Мой интервал был неправильным, вы должны поставить; между всеми параметрами, такими как

    repeat_interval => freq=weekly;byhour=10, 13
    
  5. В моем первом коде задания есть еще одна синтаксическая ошибка, я использую enable вместо enable.
  6. Я установил auto_drop false. Я предполагаю, что этот параметр используется, чтобы бросить работу, когда это делает его работу. Я имею в виду, если вы создаете работу, которая вносит изменения ежедневно с сегодняшнего дня до следующей недели. После достижения конечного времени эта работа была прекращена. Пожалуйста, поправьте меня, если я ошибаюсь.

    sys.dbms_scheduler.create_job(job_name        => 'BOMBASTICJOB'
                             ,job_type        => 'STORED_PROCEDURE'
                             ,job_action      => 'dingdongprocedure'
                             ,start_date      => to_date('30-09-2014 00:00:00' 
                                                              , 'dd-mm-yyyy hh24:mi:ss')
                             ,end_date        => to_date(null)
                             ,job_class       => 'DBMS_JOB$'
                             ,repeat_interval => 'Freq=Weekly; ByDay=Tue, Fri; ByHour=10, 13'
                              ,enabled          => true
                              ,auto_drop       => false
                              ,comments         => '');
    

1 ответ

Решение

Я на 12.1.0.1.0. Вы можете создать работу в простом анонимном блоке:

SQL> BEGIN
  2    DBMS_SCHEDULER.DROP_JOB (JOB_NAME => 'test_full_job_definition');
  3  END;
  4  /

PL/SQL procedure successfully completed.

SQL>
SQL> BEGIN
  2    DBMS_SCHEDULER.create_job (
  3      job_name        => 'test_full_job_definition',
  4      job_type        => 'PLSQL_BLOCK',
  5      job_action      => 'BEGIN my_job_procedure; END;',
  6      start_date      => SYSTIMESTAMP,
  7      repeat_interval => 'freq=hourly; byminute=0; bysecond=0;',
  8      end_date        => NULL,
  9      enabled         => TRUE,
 10      comments        => 'Job defined entirely by the CREATE JOB procedure.');
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL>
SQL> SELECT JOB_NAME, ENABLED FROM DBA_SCHEDULER_JOBS where job_name ='TEST_FULL_JOB_DEFINITION'
  2  /

JOB_NAME                                 ENABL
---------------------------------------- -----
TEST_FULL_JOB_DEFINITION                 TRUE

SQL>

Больше примеров здесь

Другие вопросы по тегам