繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM