Подтвердить что ты не робот

Управление обработкой ошибок при запуске 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 выйти из строя. Но, раздражающе, он продолжает двигаться вперед без упоминания какого-либо кода ошибки. Что еще нужно сделать здесь?

4b9b3361

Ответ 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, поэтому всякий раз, когда параметр ошибки не влияет на него.