Как создать задание dbms, которое запускается в будние дни (пн-пт) в 5:30 утра

Я хочу создать задание dbms, используя пакет DBMS_JOB.SUBMIT, который запускается по будням (пн-пт) в 5:30. Я не уверен, какие значения следует передавать в next_Day и interval Может ли кто-нибудь помочь?


person Nik    schedule 14.02.2017    source источник
comment
используйте dbms_scheduler. stackoverflow.com/questions/4152111/dbms-job-vs -dbms-планировщик   -  person Rene    schedule 14.02.2017


Ответы (2)


Используя пакет dbms_schedular, который доступен с версии 10g, вы можете используйте параметр «repeat_interval» следующим образом:

BEGIN
    DBMS_SCHEDULER.CREATE_JOB (
            job_name => 'MY_JOB',
            job_type => 'PLSQL_BLOCK',
            job_action => 'your code',
            number_of_arguments => 0,
            start_date => NULL,
            repeat_interval => 'FREQ=WEEKLY;BYTIME=053000;BYDAY=MON,TUE,WED,THU,FRI',
            end_date => NULL,
            enabled => FALSE,
            auto_drop => FALSE,
            comments => '');

END;
/

Кроме того, если вы используете IDE, такую ​​как Разработчик SQL, вы можете легко задать детали своей работы, не беспокоясь о синтаксисе. На самом деле приведенный выше код сгенерирован SQL Developer.

ОБНОВЛЕНИЕ
Попробуйте следующее, используя dbms_job (не проверено)

DECLARE
   l_job_number NUMBER;
BEGIN
   dbms_job.submit( 
          job       => l_job_number ,
          what      => 'your code',
          next_date => trunc(sysdate)+05/24+30/1440,
          interval  => CASE WHEN (to_char(sysdate,'Day') IN ('Monday','Tuesday','Wednesday','Thursday','Friday')) THEN trunc(sysdate)+05/24+30/1440 else null end 
          );
END;
/
person Hawk    schedule 14.02.2017
comment
Я хочу, чтобы он создал его через пакет dbms_job, потому что на данный момент у меня нет прав на выполнение пакета dbms_scheduler. Не могли бы вы помочь? - person Nik; 14.02.2017
comment
это показывает ошибку рядом); (где работа заканчивается). Только вопрос - нужно ли закрывать дело? - person Nik; 14.02.2017
comment
interval => CASE WHEN (to_char(sysdate,'День') IN ('Понедельник','Вторник','Среда','Четверг','Пятница')) THEN '' END --Какое должно быть правильное значение вместо этого из '' после ТОГДА. Этот оператор не показывает никаких синтаксических ошибок. - person Nik; 14.02.2017
comment
@user7349009 user7349009 Да, должно быть then ... end Я исправил это - person Hawk; 14.02.2017
comment
Это должно быть «fmday», иначе текст дополняется пробелом. - person Wernfried Domscheit; 14.02.2017
comment
Задание выполняется успешно, но не запускается в указанное время, например 5:30? - person Nik; 20.02.2017
comment
@WernfriedDomscheit Не могли бы вы помочь с этим? - person Nik; 20.02.2017
comment
@Hawk - Не могли бы вы пересмотреть это? - person Nik; 20.02.2017
comment
Вы должны использовать CASE WHEN (to_char(sysdate,'fmDay') IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')) THEN ... или даже лучше CASE WHEN (to_char(sysdate,'fmDay', 'nls_date_language = english') IN ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday')) THEN ... - person Wernfried Domscheit; 20.02.2017
comment
@WernfriedDomscheit - выдает ошибку ORA-06512 в строке «Case when........then...» - person Nik; 21.02.2017
comment
ОБЪЯВИТЬ X НОМЕР; BEGIN SYS.DBMS_JOB.SUBMIT ( job =› X ,what =› 'BEGIN schema_name.proc_name; END;', next_date =› to_date('22/02/2017 05:30:00','dd/mm/yyyy hh24 :mi:ss') ,interval =› CASE WHEN (to_char(sysdate,'fmDay') IN('понедельник','вторник','среда','четверг','пятница')) THEN trunc(sysdate)+ 24.05+30.1440 иначе конец null ,no_parse => FALSE ); SYS.DBMS_OUTPUT.PUT_LINE('Номер задания: ' || to_char(x)); СОВЕРШИТЬ; КОНЕЦ; / - person Nik; 21.02.2017
comment
Я пробовал несколько способов, но ни один из них не работал. Кажется, это невозможно - выберите DBMS_SCHEDULER, как предложено в ответе (и в соответствии с рекомендациями Oracle DBMS_JOB ). - person Wernfried Domscheit; 21.02.2017
comment
Также должно быть что-то для dbms_job... Как я уже говорил, в настоящее время у меня нет доступа к dbms_scheduler. - person Nik; 21.02.2017

Сначала нам нужно создать одну определяемую пользователем функцию следующим образом:

CREATE OR REPLACE FUNCTION GET_DATE RETURN DATE
is 

V_DAY VARCHAR2(10);
V_DATE DATE;

BEGIN

SELECT (to_char(sysdate,'fmDay')) INTO V_DAY FROM DUAL;

IF(V_DAY='Monday' OR V_DAY='Tuesday' OR V_DAY='Wednesday' OR V_DAY='Thursday') THEN


SELECT trunc(sysdate+1)+05/24+30/1440 INTO V_DATE FROM DUAL;
RETURN V_DATE;

ELSE

SELECT trunc(sysdate+3)+05/24+30/1440 INTO V_DATE FROM DUAL;
RETURN V_DATE;

END IF;

END;
/

После этого нам нужно создать задание следующим образом:

DECLARE
  XYZ NUMBER;
BEGIN
  SYS.DBMS_JOB.SUBMIT
  ( job       => XYZ 
   ,what      => 'BEGIN PROC_NAME; END;'
   ,next_date => to_date('23/03/2017 05:30:00','dd/mm/yyyy hh24:mi:ss')
   ,interval  => 'GET_DATE'
   ,no_parse  => FALSE
  );

END;
/
person Nik    schedule 23.03.2017