在 bash 脚本中忽略 sqlplus 中的 ORA-28011

Ignore ORA-28011 in sqlplus in bash script

我在 shell 脚本中使用 sqlplus,我正在使用 WHENEVER SQLERROR EXIT 8WHENEVER OSERROR EXIT 9 以便我可以使用 $?.

捕获错误

我将把这段代码放在我知道密码过期的服务器上 warning/error 'ORA-28011'.

我的问题是,我的脚本是否会在 'ORA-28011' 上运行,即使它不是真正的错误?如果是这样,我将如何忽略它?

我的(简化的)代码,如果有帮助的话:

[...]    
CONNECTION_STRING=$USER/$PASS@$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

如果有人感兴趣,我解决了这个问题。

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