Shell脚本中的SQL * Plus:将COUNT(*)发送到变量,将错误发送到文件

时间:2016-04-22 02:23:54

标签: sql oracle shell unix

我从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子句。

有可能吗?

谢谢。

1 个答案:

答案 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

(希望我不会公然地退出游戏;)