[英]SQL*Plus in Shell Script: Send COUNT(*) to Variable, Error to File
我正在从 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抛出一个异常,我宁愿是错误定向到一个文件,然后cat
从我中的文件“时出现错误”条件/ if
条款。
是否可以?
谢谢你。
我可能会遗漏一些东西,但你拥有一切让它工作!
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
(希望我没有公然退出游戏;)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.