【问题标题】:Sql*plus always returns exit code 0?Sql*plus 总是返回退出码 0?
【发布时间】:2013-08-09 07:25:45
【问题描述】:

每当我使用 Sql*plus 运行 sql 脚本并检查 $? 时,即使脚本不成功,我也会得到 0。

例子

#$ sqlplus user/password@instance @script.sql


SQL*Plus: Release 10.2.0.1.0 - Production on Wed Aug 7 14:20:44 2013

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production

     v$dataf-ile d,
            *
ERROR at line 6:
ORA-00933: SQL command not properly ended


Disconnected from Oracle9i Enterprise Edition Release 9.2.0.8.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.8.0 - Production
$ echo $?
0
$

我希望它在发生错误时返回一个非零值。

我怎样才能做到这一点?

【问题讨论】:

    标签: oracle scripting sqlplus exit-code


    【解决方案1】:

    您必须在脚本中明确告诉sqlplus 这样做。基本上,您可以使用两种语句:

    • WHENEVER SQLERROR EXIT SQL.SQLCODE
    • WHENEVER OSERROR EXIT

    例如:

    WHENEVER SQLERROR EXIT SQL.SQLCODE
    begin
      SELECT COLUMN_DOES_NOT_EXIST FROM DUAL;
    END;
    /
    

    对于操作系统错误:

    WHENEVER OSERROR EXIT FAILURE
    START no_such_file
    

    有关详细信息,请参阅thisthat

    希望对您有所帮助。祝你好运!

    【讨论】:

    • EDIT - WHENEVER OSERROR EXIT 的默认退出代码为 0 (SUCCESS),因此必须明确指定其他选项。我添加了 FAILURE 选项。
    【解决方案2】:

    Vlad's 是我会使用的答案。但是,为了增加他的功能,如果我真的需要返回状态,我会尝试使用显式的 EXIT 语句。例如

    column status_for_exit new_value exitcode noprint
    select status_computation (parm, parm) as status_for_exit from dual;
    
    exit &exitcode;
    

    【讨论】:

      【解决方案3】:

      最好的行动可能是结合本页面上的其他想法和在

      Help with SQLPLUS please? How to make SQLPLUS startup with DEFINE `OFF` initially?

      制作一个 login.sql 文件,或编辑全局文件以拥有

      WHENEVER OSERROR EXIT FAILURE
      WHENEVER SQLERROR EXIT SQL.SQLCODE
      

      在里面。 然后,如果该文件不存在,它将出错。如果一行失败,就会报错。

      但是,请记住,正如文档所说:https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve052.htm#SQPUG135 某些命令仍然不会像您预期的那样出错。

      【讨论】:

        【解决方案4】:

        出于安全原因,Oracle 12.2 根据这些blog articles 进行了更改。

        login.sql 将被静默忽略,除非您明确设置

        • 在 Linux 上:ORACLE_PATH
        • 在 Windows 上:SQLPATH

        到可以找到login.sql 的目录。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-01-03
          • 2013-04-03
          • 2021-11-24
          • 1970-01-01
          相关资源
          最近更新 更多