#!/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
我正在输入垃圾值,试图强制此脚本失败。但是,令人讨厌的是,它一直在前进,没有提到任何错误代码。还有什么需要做的吗?
答案 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级别本身失败,因此无论何时错误设置都不会影响它。