【问题标题】:SQL*Plus in Shell Script: Send COUNT(*) to Variable, Error to FileShell 脚本中的 SQL*Plus:将 COUNT(*) 发送到变量,将错误发送到文件
【发布时间】: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 该文件。

有可能吗?

谢谢。

【问题讨论】:

    标签: sql oracle shell unix


    【解决方案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
    

    (希望我没有公然退出游戏;)

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2017-03-14
      • 1970-01-01
      相关资源
      最近更新 更多