2013-08-07 4 views
13

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

Пример

#$ 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 
$ 

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

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

ответ

20

Вы должны явно указать 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 

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

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

+1

EDIT - код выхода по умолчанию с WHENEVER OSERROR EXIT равен 0 (SUCCESS), поэтому необходимо указать конкретную другую опцию. Я добавил опцию FAILURE. – dbenham

5

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

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

exit &exitcode; 
0

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

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

Смежные вопросы