#oracle #oracle11g #scheduled-tasks
#Oracle #oracle11g #запланированные задачи
Вопрос:
У меня есть материализованное представление MVIEW_MY_AU
, которое обновляется из имени хранимой процедуры REFRESH_MVIEWS_VIA_PRC
. Этот SP содержит следующее утверждение :
dbms_mview.refresh('MVIEW_MY_AU');
В REFRESH_MVIEWS_VIA_SCH
таблице all_scheduler_jobs создается задание для выполнения этой хранимой процедуры.
Запрос :
select job_name, last_start_date,next_run_date,job_action from all_scheduler_jobs
where job_name = 'REFRESH_MVIEWS_VIA_SCH'
Вывод :
В соответствии с запланированным заданием я ожидаю, что это материализованное представление обновится в 3:30 утра по австралийскому времени. Но когда он обновляется в 4:30 утра по австралийскому времени в соответствии со следующим запросом :
Запрос :
SELECT LAST_REFRESH
,TO_CHAR(last_refresh, 'MM/DD/YYYY HH24:MI:SS A.M.') as LAST_REFRESH_TIME
FROM user_mview_refresh_times
where name like 'MVIEW_MY_AU'
Вывод :
Я начал сталкиваться с этой проблемой после перехода на летнее время для Австралии, начавшегося 2 октября 2016 года. Есть ли какой-либо способ запланировать задание, которое будет учитывать время экономии дневного света?
Ответ №1:
Существует несколько способов, с помощью которых Oracle будет учитывать переход на летнее время.
Введите TIMESTAMP WITH TIME ZONE
значение для параметра start_time
, например SYSTIMESTAMP
, или CURRENT_TIMESTAMP
Из документации DBMS_SCHEDULER:
Когда значение start_date равно НУЛЮ, планировщик определяет часовой пояс для интервала повторения следующим образом:
- Он проверяет, является ли часовой пояс сеанса именем региона. Часовой пояс сеанса может быть установлен либо:
- Выдача инструкции ALTER SESSION, например: SQL>
ALTER SESSION SET time_zone = 'Asia/Shanghai';
- Установка
ORA_SDTZ
переменной среды.- Если часовой пояс сеанса является абсолютным смещением вместо имени региона, планировщик использует значение атрибута
DEFAULT_TIMEZONE
Scheduler.- Если
DEFAULT_TIMEZONE
атрибут равен нулю, планировщик использует часовой пояс systimestamp при включении задания или окна.
Самое главное: часовой пояс должен быть указан как регион, например Australia/Sydney
, а не как смещение UTC, как 08:00
Что касается вашего запроса:
Столбец LAST_REFRESH представления user_mview_refresh_times
DATE
— это тип данных, поэтому по определению он не содержит никакой информации о часовом поясе. Скорее всего, столбец LAST_REFRESH
указан в часовом поясе сервера операционной системы вашей БД (т. Е. Значение часового пояса SYSDATE
). Какой часовой пояс вашего сервера операционной системы DB? Вы можете определить это в ОС напрямую или с помощью
SELECT TO_CHAR(SYSTIMESTAMP, 'tzr') FROM dual;