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

Shell脚本中的SQL*Plus:将计数(*)发送到变量,将错误发送到文件,sql,oracle,shell,unix,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 VERIF

我正在从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
我一直在尝试将我的
stderr
重定向到一个文件,在出现异常时将其重定向到“
cat
”,但随后我的非错误条件输出也被定向到该文件,这是我不想要的

如果没有类似的SQL错误,我只希望将
COUNT(*)
的值直接指向shell脚本变量
test\u COUNT

另一方面,如果SQL引发异常,我更愿意将该错误指向一个文件,然后从我的“遇到错误”条件/
If
子句中
cat
该文件

可能吗


谢谢你。

我可能错过了什么,但你有一切可以让它工作

除非您太早离开脚本(使用退出1): 在出现错误的情况下,您不能退出,因为您希望显示的错误在结果变量
test\u 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
(希望我没有公然退出比赛;)

[...]
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