2013-08-07 15 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にスクリプトで明示的に指示する必要があります。基本的には、2つのステートメントは、あなたが使用できることがあります。たとえば

  • 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 

詳細については、thisおよびthatを参照してください。

希望します。がんばろう!

+1

EDIT - WHENEVER OSERROR EXITを使用するデフォルトの終了コードは0(SUCCESS)なので、他のオプションを明示的に指定する必要があります。 FAILUREオプションを追加しました。 – dbenham

5

私は使用している答えはVlad'sです。しかし、私は本当にその返品ステータスが必要な場合、彼を増やすために、私は明示的な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ファイルを作成し、またはグローバル1を編集かもしれません
WHENEVER OSERROR EXIT FAILURE 
WHENEVER SQLERROR EXIT SQL.SQLCODE 

の内部です。 ファイルが存在しない場合、エラーが発生します。行が失敗すると、エラーが発生します。

しかし、ドキュメントでは、https://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_twelve052.htm#SQPUG135 には、予想通りに特定のコマンドがエラーにならないことに注意してください。