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

时间:2013-02-06 16:35:49

标签: oracle shell sqlplus aix

#!/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

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

5 个答案:

答案 0 :(得分: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

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

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

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

答案 1 :(得分:5)

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

$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

答案 2 :(得分:3)

Aji的回答

WHENEVER SQLERROR EXIT SQL.SQLCODE;

然后使用

sql_return_code=$?

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


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

因此它会grep假脱机日志文件,然后切断实际的最新ORA代码。

答案 3 :(得分:1)

您输入假值的事实可能只与登录有关。然后: Check database connectivity using Shell script

WHENEVER ...用于执行SQL脚本期间的错误。一旦你成功连接你的脚本(我现在认为这是你的问题),你应该得到由WHENEVER ERROR管理的那种错误,因为你遗忘了EXEC的{​​{1}} }。

答案 4 :(得分:0)

您只能捕获sql错误或操作系统错误。 dbms_output将在sqlplus级别本身失败,因此无论何时错误设置都不会影响它。