【发布时间】:2016-04-22 02:23:53
【问题描述】:
我正在从 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”,但是我的非错误条件输出是 也指向那个我不想要的文件。
在没有任何此类 SQL 错误的情况下,我更愿意将 COUNT(*) 的值指向 shell 脚本变量 test_count。
另一方面,如果 SQL 引发异常,我更愿意将该错误定向到一个文件,然后在我的“遇到错误”条件/if 子句中 cat 该文件。
有可能吗?
谢谢。
【问题讨论】: