Я хочу создать задание dbms, используя пакет DBMS_JOB.SUBMIT, который запускается по будням (пн-пт) в 5:30. Я не уверен, какие значения следует передавать в next_Day и interval Может ли кто-нибудь помочь?
Как создать задание dbms, которое запускается в будние дни (пн-пт) в 5:30 утра
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
Я хочу, чтобы он создал его через пакет dbms_job, потому что на данный момент у меня нет прав на выполнение пакета dbms_scheduler. Не могли бы вы помочь?
- person Nik; 14.02.2017
это показывает ошибку рядом); (где работа заканчивается). Только вопрос - нужно ли закрывать дело?
- person Nik; 14.02.2017
interval => CASE WHEN (to_char(sysdate,'День') IN ('Понедельник','Вторник','Среда','Четверг','Пятница')) THEN '' END --Какое должно быть правильное значение вместо этого из '' после ТОГДА. Этот оператор не показывает никаких синтаксических ошибок.
- person Nik; 14.02.2017
@user7349009 user7349009 Да, должно быть
then ... end
Я исправил это
- person Hawk; 14.02.2017
Это должно быть «fmday», иначе текст дополняется пробелом.
- person Wernfried Domscheit; 14.02.2017
Задание выполняется успешно, но не запускается в указанное время, например 5:30?
- person Nik; 20.02.2017
@WernfriedDomscheit Не могли бы вы помочь с этим?
- person Nik; 20.02.2017
@Hawk - Не могли бы вы пересмотреть это?
- person Nik; 20.02.2017
Вы должны использовать
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
@WernfriedDomscheit - выдает ошибку ORA-06512 в строке «Case when........then...»
- person Nik; 21.02.2017
ОБЪЯВИТЬ 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
Я пробовал несколько способов, но ни один из них не работал. Кажется, это невозможно - выберите
DBMS_SCHEDULER
, как предложено в ответе (и в соответствии с рекомендациями Oracle DBMS_JOB ).
- person Wernfried Domscheit; 21.02.2017
Также должно быть что-то для 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