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

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

4

5 回答 5

16

麦克斯说的是对的。试试这个修改后的脚本

#!/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了解更多信息。

于 2013-02-12T09:26:21.753 回答
7

建立与数据库的连接后,您的语句可能会whenever被执行(因为您后来提到过它们)。试试下面的代码: -

$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
于 2013-02-10T05:02:20.077 回答
6

阿吉的回答是

WHENEVER SQLERROR EXIT SQL.SQLCODE;

然后使用

sql_return_code=$?

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


UNIX 操作系统中的 Shell 脚本最多可以返回 255 个代码。例如,“ORA-12703 不支持此字符集转换”返回代码应该是 12703,但它不适合 UNIX 8 位返回代码。
实际上,我只是做了一个测试并运行了一个错误的 SQL,该 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 代码。

于 2014-08-08T00:02:05.137 回答
1

您输入假值的事实可能仅与登录有关。然后: 使用 Shell 脚本检查数据库连接

WHENEVER ...用于 SQL 脚本执行期间的错误。一旦你成功连接到你的脚本(我现在假设这是你的问题),你应该得到管理的那种错误,WHENEVER ERROR因为你忘记EXECDBMS_OUTPUT.

于 2013-02-11T13:40:55.047 回答
0

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

于 2013-04-08T20:48:54.257 回答