-= Начало перевода =-
Когда мы имеем несколько интерфейсов, переменных и других объектов в дочернем сценарии, и когда, при этом, дочерний сценарий завершается с ошибкой, в главном сценарии нам возвращается ошибка: "Сценарий не завершился должным образом". Чтобы узнать, что произошло, нам необходимо смотреть в Оператор.
Вот простой метод, который поможет заглянуть в результаты выполнения дочернего сценария, и получить полное сообщение об ошибке, а также, при необходимости, занести это сообщение в лог ошибок.
Создайте глобальную переменную, назвав ее, например, "GET_ERROR_MSG", поместите в поле Select этой переменной следующий код:
SELECT ' The '||CASE
WHEN SSS.STEP_TYPE='F' THEN 'INTERFACE'
WHEN SSS.STEP_TYPE='VD' THEN 'VARAIBLE DECLARATION'
WHEN SSS.STEP_TYPE='VS' THEN 'SET/INCREMENT VARAIBLE'
WHEN SSS.STEP_TYPE='VE' THEN 'EVALUATE VARIABLE'
WHEN SSS.STEP_TYPE='V' THEN 'REFRESH VARIABLE'
WHEN SSS.STEP_TYPE='T' THEN 'PROCEDURE'
WHEN SSS.STEP_TYPE='OE' THEN 'OS COMMAND'
WHEN SSS.STEP_TYPE='SE' THEN 'ODI TOOL'
WHEN SSS.STEP_TYPE='RM' THEN 'REVERSE ENGINEERING MODEL'
WHEN SSS.STEP_TYPE='CM' THEN 'CHECK MODEL'
WHEN SSS.STEP_TYPE='CS' THEN 'CHECK SUB MODEL'
WHEN SSS.STEP_TYPE='CD' THEN 'CHECK DATA STORE'
WHEN SSS.STEP_TYPE='JM' THEN 'JOURNALIZE MODEL'
WHEN SSS.STEP_TYPE='JD' THEN 'JOURNALIZE DATA STORE'
END||' '||SSS.STEP_NAME||
' , has failed due to - '||
SNET.TXT
FROM <%=odiRef.getObjectName("SNP_SESSION")%> SS,
<%=odiRef.getObjectName("SNP_SESS_STEP")%> SSS,
<%=odiRef.getObjectName("SNP_EXP_TXT")%> SNET
WHERE SSS.SESS_NO=SS.SESS_NO
AND SNET.I_TXT=SS.I_TXT_SESS_MESS
AND SNET.TXT_ORD=0
AND SS.PARENT_SESS_NO ='<%=odiRef.getPrevStepLog("SESS_NO")%>'
Примечание: Выбирайте для этой переменной схему рабочего репозитория тогда команда getObjectName сможет правильно выбрать необходимые таблицы. Или замените команду getObjectName на <%=odiRef.getSchemaName("")%> с указанием соответствующей схемы БД.
На первом шаге родительского пакета вызывайте компонент OdiOutFile, убрав признак добавления в конец файла (Append), таким образом, новый файл будет создан на каждую ежедневную загрузку.
Затем вставьте вызов дочернего сценария, а также вызов команды обновления переменной GET_ERROR_MSG. Добавьте переход по неверному завершению сценария (красная стрелка "KO") на обновление переменной, таким образом, только при неверном завершении сценария будет вызвана эта переменная, в обратном случае будет запущен следующий дочерний сценарий.
Следующий шаг - вызов OdiOutFile с указанием того же файла, что и в первом шаге, установкой признака добавления в конец файла, и передачей в качестве параметра Text значения нашей переменной. Повторите данный прием при вызове всех остальных дочерних сессий.
Таким образом можно собрать все ошибки в дочерних сессиях в один файл, и отослать потом этот файл как вложенный файл через OdiSendMail.
-= Конец перевода =-
Примечания:
1. Очевидно, вызов дочерних сценариев осуществляется, в данном примере, в синхронном режиме. При асинхронных вызовах переходить к обновлению переменной GET_ERROR_MSG нужно от команды WaitForChildSessions.
2. Теоретически, не всегда возможны ситуации, когда после падения первого дочернего сценария можно вызывать следующий. Возможно, они зависят друг от друга, тогда необходимо продумывать другую последовательность выполнения главного пакета.
3. Во время перевода и повторения описанных в статье шагов я создавал файл в имени которого добавлялась системная дата, в оригинальной статье использовался один файл ошибок, который должен был перезаписываться при каждом запуске.
4. Удалось вывести текст в файл на русском языке. Для этого в команде OdiOutFile была установлена кодировка Cp1251 в поле Charset.
5. Полный список доступных кодировок доступен по ссылке, которая так удачно нашлась в документации по OdiOutFile.
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.