我从Korn shell(ksh)调用Oracle SQL * Plus。
我的最终目标是将SQL语句的COUNT(*)
中的值转换为shell脚本变量。
但是,如果引发SQL错误,我想完整地报告SQL异常并终止脚本。
我很难将这两种情景都考虑在内,令我满意。
#!/bin/ksh
test_count=$(sqlplus -s scott/tiger << EOF1
WHENEVER SQLERROR EXIT 1
SET PAGESIZE 0 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF
SELECT COUNT(*) FROM scott.emp WHERE empno > 7777;
EXIT;
EOF1
)
sql_ret_code=$?
if [ $sql_ret_code -ne 0 ]
then
echo "Error encountered."
echo
exit 1
fi
echo "test_count = $test_count"
exit 0
在“快乐路径”案例中,上述作品(显示test_count = 8
)。
如果我通过引用不存在的表(例如,“scott.emp_bogus
”)来模拟SQL错误,则上面的代码仅打印通用消息“遇到错误”。我更愿意报告完整的Oracle异常,如下所示:
Error encountered.
SELECT COUNT(*) FROM scott.emp_bogus WHERE empno > 7777
*
ERROR at line 1:
ORA-00942: table or view does not exist
我一直在努力将我的stderr
重定向到一个文件,如果发生异常则将其重定向到“cat
”,但是我的非错误条件输出也< / em>被定向到那个我不想要的文件。
如果没有这样的SQL错误,我只想将COUNT(*)
的值指向shell脚本变量test_count
。
另一方面,如果SQL引发异常,我宁愿将该错误指向一个文件,然后cat
该文件来自我的“遇到错误”条件/ if
子句。
有可能吗?
谢谢。
答案 0 :(得分:1)
我可能会遗漏一些东西,但你在这里有一切可以让它发挥作用!
exit 1
):您不能以错误情况退出,因为您想要显示的错误位于结果变量 test_count
中!那么为什么不显示呢?这是我可以提出的建议
[...]
if [ $sql_ret_code -ne 0 ]
then
echo "Error encountered."
echo
echo "ERROR: $test_count"
echo "abort."
exit 1
fi
echo "test_count = $test_count"
exit 0
(希望我不会公然地退出游戏;)