Управление обработкой ошибок при запуске sqlplus из сценариев оболочки
#!/bin/sh
echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name
LOGFILE=shell_log.txt
$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
connect $eval_user/[email protected]$db_name
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
DBMS_OUTPUT.put_line('Connected to db');
EOF
if [ $? != 0 ]
then
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $?"
exit 0;
fi
Я ввожу значения мусора, пытаясь заставить этот script выйти из строя. Но, раздражающе, он продолжает двигаться вперед без упоминания какого-либо кода ошибки. Что еще нужно сделать здесь?
Ответы
Ответ 1
Что говорит Макс, верно. Попробуйте этот модифицированный script
#!/bin/sh
echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name
LOGFILE=shell_log.txt
sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/[email protected]$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF
sql_return_code=$?
if [ $sql_return_code != 0 ]
then
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $sql_return_code"
exit 0;
fi
Обратите внимание на использование sql_return_code для захвата кода возврата SQLPLUS.
Оператор DBMS_OUTPUT должен завершиться ошибкой с ошибкой - "SP2-0734: начало неизвестной команды...". Вы можете найти сообщение об ошибке в файле журнала.
Ловушка sp2-ошибок в SQLPLUS 11g возможна с помощью средства регистрации ошибок. Пожалуйста, посмотрите http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html для получения дополнительной информации.
Ответ 2
возможно, что ваши инструкции всегда выполняются после установления соединения с db (так как вы упомянули их позже). Попробуйте использовать следующий код: -
$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/[email protected]$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF
Ответ 3
Ответ Aji с
WHENEVER SQLERROR EXIT SQL.SQLCODE;
а затем используя
sql_return_code=$?
неверно (или не корректно в большинстве случаев). Подробнее см. Ниже.
Shell script в ОС UNIX может возвращать коды до 255.
Например. "ORA-12703 это преобразование набора символов не поддерживается" код возврата должен быть 12703, но он не вписывается в 8-битный код возврата UNIX.
На самом деле, я просто сделал тест и запустил плохой SQL, который не работает с "ORA-00936: отсутствующее выражение" -
sqlplus вернулся 168 (!).
Таким образом, фактический код возврата 936 был завернут на 256 и только что вернулся. 936% 256 = 168.
В Windows это, вероятно, может работать (не проверено), но не в UNIX (протестировано, как описано выше).
Единственный надежный механизм - это, вероятно, для генерации результатов в файл журнала, а затем сделать что-то вроде
tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2
Таким образом, это приведет к grep журнальному журналу, а затем сократит актуальный ORA-код.
Ответ 4
То, что вы вводите поддельные значения, вероятно, связано только с логином. Затем:
Проверьте подключение к базе данных с помощью оболочки script
WHENEVER ...
для ошибок во время выполнения SQL script. Как только вы успешно подключитесь к своему script (я предполагаю, что это ваша проблема прямо сейчас), вы должны получить ошибку, управляемую WHENEVER ERROR
, потому что вы забыли EXEC
в своей строке с помощью DBMS_OUTPUT
.
Ответ 5
Вы можете ловить только ошибку sql или ошибку os. Dbms_output не будет работать на уровне sqlplus, поэтому всякий раз, когда параметр ошибки не влияет на него.