2015-03-30 2 views
-1

Я использую sqlplus в сценарии оболочки, и я использую WHENEVER SQLERROR EXIT 8 и WHENEVER OSERROR EXIT 9, чтобы я мог ловить ошибки с использованием $?.Игнорировать ORA-28011 в sqlplus в сценарии bash

Я буду помещать этот код на сервер, который, как я знаю, получает предупреждение об ошибке пароля «ORA-28011».

Мой вопрос в том, будет ли мой скрипт ловить «ORA-28011», хотя это не ошибка? Если да, то как я буду игнорировать это?

My (упрощенный) код, если это помогает:

[...]  
CONNECTION_STRING=$USER/[email protected]$TNS 

RESULT=$(sqlplus -s /nolog <<-EOF 
    WHENEVER OSERROR EXIT 9; 
    WHENEVER SQLERROR EXIT 8; 
    $OPTIONS 

    CONNECT $CONNECTION_STRING 

    $DB_SQL 

    COMMIT; 
EOF) 

RETURN_CODE=$? 

echo "db_exec: Result -> $RETURN_CODE\n$RESULT" 

if [ $RETURN_CODE -eq 0 ] 
then 
    echo "$RESULT" 
    return 0 
else 
    echo "db_exec: Failed" 
    return 1 
fi 
+0

кладет пользователь/пасс в защищенном файл и использовать @filename для подключения, вместо выхода вы можете поставить случай заявление и игнорировать ор-28011 – michael501

ответ

0

В случае, если кому-то интересно, я решил эту проблему.

ORA-28011 и ORA-28002 не причина SQL * Plus для выхода при использовании WHENEVER SQLERROR EXIT # или WHENEVER OSERROR EXIT #, но появится в результате. Поэтому код в моем вопросе будет работать, но мне нужно удалить эти ошибки. Мой обновленный код ниже:

# Run the SQL with the options specified 
RESULT=$(sqlplus -s /nolog <<-EOF 
    WHENEVER SQLERROR EXIT 4; 
    WHENEVER OSERROR EXIT 5; 
    SPOOL $TEMP_FILE; 
    $DB_OPTIONS 
    $DB_CONNECT 
    $DB_SQL 
    COMMIT; 
EOF) 

# Save the return code 
RETURN_CODE=$? 

# Log the result 
echo "Result -> Code: $RETURN_CODE\n$RESULT" 1>&2 

if [ $(grep -cE '^ORA-28002:|^ORA-28011:' $TEMP_FILE) -ge 1 ] 
then 
    echo "Warning -> Password Expiry \n$(grep '^ORA-' $TEMP_FILE)" 1>&2 
fi 

# Check the return code and catch any SQL*Plus (SP2-) errors that might not have presented an error code 
if [ $RETURN_CODE -eq 0 ] && [ $(grep -c '^SP2-[0-9][0-9][0-9][0-9]' $TEMP_FILE) -eq 0 ] 
then 
    # Echo the result, but remove any lines regarding password expiry 
    echo "$RESULT" | grep -v "^ERROR:" | grep -v "^ORA-[0-9][0-9][0-9][0-9][0-9]" 
    rm $TEMP_FILE 
    echo "Success" 1>&2 
    return 0 
elif [ $RETURN_CODE -eq 4 ] 
then 
    echo "Failed -> SQL Error \n$(grep '^ORA-' $TEMP_FILE) $(grep '^SP2-' $TEMP_FILE)" 1>&2 
    return 4 
elif [ $RETURN_CODE -eq 5 ] 
then 
    echo "Failed -> OS Error \n$(grep '^ORA-' $TEMP_FILE) $(grep '^SP2-' $TEMP_FILE)" 1>&2 
    return 5 
elif [ $(grep -c "^SP2-[0-9][0-9][0-9][0-9]" $TEMP_FILE) -ne 0 ] 
then 
    echo "Failed -> SQL*Plus Error \n$(grep '^SP2-' $TEMP_FILE)" 1>&2 
    return 6 
else 
    echo "Unknown error -> $RETURN_CODE\n$RESULT" 1>&2 
    return 3 
fi 
Смежные вопросы