从shell脚本运行sqlplus时管理错误处理

roy*_*g86 14 oracle shell aix 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/$eval_pass@$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
Run Code Online (Sandbox Code Playgroud)

我正在输入垃圾值,试图强制此脚本失败.但是,令人讨厌的是,它一直在前进,没有提到任何错误代码.还有什么需要做的吗?

小智 13

Max说的是正确的.试试这个修改过的脚本

#!/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/$eval_pass@$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
Run Code Online (Sandbox Code Playgroud)

请注意使用sql_return_code捕获SQLPLUS返回码.

DBMS_OUTPUT语句应该失败并显示错误 - "SP2-0734:未知命令开始...".您可以在日志文件中找到错误消息.

可以使用错误日志记录工具捕获SQLPLUS 11g中的sp2错误.有关更多信息,请查看http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html.

  • UNIX OS中的Shell脚本最多可以返回255个代码.所以我不明白WHENEVER SQLERROR EXIT SQL.SQLCODE; 可以正确返回255以上的SQL代码?例如ORA-12703不支持这个字符集转换实际上我只是做了一个测试并运行了一个错误的SQL,它失败了ORA-00936:缺少表达式错误的sqlplus返回168(!)所以实际的返回代码936被包裹,只剩下得到了回报.936%256 = 168.这不是一个正确的答案. (4认同)

Max*_*Max 5

在建立与db的连接之后执行when语句可能是可能的(因为之后你已经提到过它们).请尝试以下代码: -

$ORACLE_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF
Run Code Online (Sandbox Code Playgroud)


Tag*_*gar 5

阿治的回答

WHENEVER SQLERROR EXIT SQL.SQLCODE;
Run Code Online (Sandbox Code Playgroud)

然后使用

sql_return_code=$?
Run Code Online (Sandbox Code Playgroud)

是不正确的(或者在大多数情况下是不正确的)。请参阅下面的详细信息。


UNIX OS中的Shell脚本最多可以返回255个代码。例如“不支持此字符集转换的ORA-12703”返回代码应为12703,但它不适合UNIX 8位返回代码。
实际上,我只是做了一个测试,然后运行了一个错误的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
Run Code Online (Sandbox Code Playgroud)

因此,它将grep后台打印日志文件,然后剪切实际的最新ORA代码。