Проблемы с поиском ошибок с помощью errorlevel

У меня возникают проблемы с ошибками в некоторых моих пакетных заданиях. В настоящее время я запускаю 50 пакетных заданий каждый день с файлом журнала, который сообщает мне, было ли пакетное задание выполнено успешно или нет. На прошлой неделе я заметил некоторые ошибки, и прямо сейчас у меня нет никакого контроля, который показывает или просто сообщает мне, если пакетное задание завершается с ошибкой. Мои пакетные задания запускаются по сценарию через sqlplus. Я пробовал использовать уровень ошибок, но id не сработал.

Моя пакетная работа выглядит так до сих пор. Я включил код уровня ошибки, который пытался использовать.

@Echo Off
@For /F "tokens=1,2,3,4 delims=-/ " %%A in ('Date /t') do @(
Set Day=%%A
Set Month=%%B
Set Year=%%C
Set All=%%A-%%B-%%C
)
@For /F "tokens=1,2,3 delims=:,. " %%A in ('echo %time%') do @(
Set Hour=%%A
Set Min=%%B
Set Sec=%%C
Set Allm=%%A.%%B.%%C
)
@For /F "tokens=3 delims=: " %%A in ('time /t ') do @(
Set AMPM=%%A
@Echo On
)
echo Start: %date% %time%    >> ..\log\Scriptname_%All%_%Allm%.log
sqlplus "Script" >> ..\log\Scriptname_%All%_%Allm%.log
IF %errorlevel% NEQ 0 GOTO :Error
GOTO :Success
:error
echo There was an error.
echo Stop: %date% %time%    >> ..\log\Scriptname_%All%_%Allm%.log
EXIT 1
:end
echo Success.
echo Stop: %date% %time%    >> ..\log\Scriptname_%All%_%Allm%.log
EXIT 0

person mr-benchwarmer    schedule 26.06.2014    source источник


Ответы (2)


Ваш пакетный файл выглядит нормально. Проблема, скорее всего, связана с вашим скриптом SQL*PLUS.

SQL*PLUS не возвращает ошибку по умолчанию, если ошибка возникает в сценарии SQL*PLUS. Вы можете использовать КОГДА SQLERROR и КАГДА НЕ ОШИБКА в сценарии SQL*PLUS для принудительного завершения с ненулевым код ошибки за ошибкой.

whenever sqlerror exit failure
whenever oserror exit failure

Существуют различные параметры для лучшего контроля возвращаемого кода и управления поведением транзакции (фиксация или откат). Перейдите по ссылкам для получения дополнительной информации.

person dbenham    schedule 26.06.2014

Я думаю, что sqlplus по умолчанию не возвращает коды ошибок, поэтому всегда возвращает 0.

Некоторые варианты изменения описаны в этой теме:

Sql*plus всегда возвращает код выхода 0?

Другой способ — захватить выходные данные и проанализировать их для обнаружения ошибок.

person dethorpe    schedule 26.06.2014