2013-08-07 84 views
13

每當我使用Sql * plus運行sql腳本並檢查$?時,即使腳本不成功,我也會得到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; 
/

而對於OS錯誤:

WHENEVER OSERROR EXIT FAILURE 
START no_such_file 

欲瞭解更多信息,請參閱thisthat

希望它有幫助。祝你好運!

+1

編輯 - WHENEVER OSERROR EXIT的默認退出代碼爲0(SUCCESS),所以必須顯式指定其他選項。我添加了失敗選項。 – 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 某些命令仍然不會像您期望的那樣出錯。