2015-03-30 214 views
-1

我在shell腳本中使用sqlplus,我使用WHENEVER SQLERROR EXIT 8WHENEVER OSERROR EXIT 9,以便我可以使用$?捕獲錯誤。在bash腳本中忽略sqlplus中的ORA-28011

我將把這段代碼放在一臺服務器上,我知道密碼到期警告/錯誤'ORA-28011'。

我的問題是,我的腳本是否會出現'ORA-28011',即使它不是一個真正的錯誤?如果是這樣,我怎麼會忽略它呢?

我(簡化)代碼,如果它可以幫助:

[...]  
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

把你的用戶名/密碼在一個安全的文件,並使用@文件名進行連接,而不是退出,你可以把一個case語句,而忽略ORA-28011 – michael501 2015-03-30 22:04:30

回答

0

如果有人有興趣,我解決了這個問題。

ORA-28011和ORA-28002 不要使用WHENEVER SQLERROR EXIT #WHENEVER OSERROR EXIT #時反而會出現在結果事業的SQL * Plus退出。因此,我的問題中的代碼將工作,但我需要刪除這些錯誤。我更新的代碼如下:

# 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