Подтвердить что ты не робот

Sql * plus всегда возвращает код выхода 0?

Всякий раз, когда я запускаю sql script с помощью Sql * plus и проверяю на $?, я получаю 0, даже когда script не был успешным.

Пример

#$ sqlplus user/[email protected] @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
$

Я хочу, чтобы он возвращал ненулевое значение при возникновении ошибки.

Как я могу это достичь?

4b9b3361

Ответ 1

Вы должны явно указать sqlplus, чтобы сделать это, в script. В принципе, есть два утверждения, которые вы можете использовать:

  • 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

Для получения дополнительной информации см. этот и который.

Надеюсь, это поможет. Удачи!

Ответ 2

Влад - это ответ, который я бы использовал. Однако, чтобы увеличить его, я пытаюсь использовать явный оператор EXIT, если мне действительно нужен этот статус возврата. Например

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

exit &exitcode;

Ответ 3

Лучшее действие может сочетать другие идеи на этой странице и идеи в

Помогите с SQLPLUS, пожалуйста? Как запустить SQLPLUS с DEFINE `OFF` изначально?

Сделайте файл 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 что некоторые команды по-прежнему не будут выходить из строя, как вы могли бы ожидать.