web-dev-qa-db-fra.com

Sql * plus renvoie toujours le code de sortie 0?

Chaque fois que j'exécute un script sql en utilisant Sql * plus et vérifie $?, J'obtiens 0 même lorsque le script n'a pas réussi.

Exemple

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

Je voudrais qu'il renvoie une valeur non nulle lorsqu'une erreur se produit.

Comment puis-je y parvenir?

19
Tulains Córdova

Vous devez explicitement dire à sqlplus de le faire, dans votre script. Fondamentalement, vous pouvez utiliser deux instructions:

  • WHENEVER SQLERROR EXIT SQL.SQLCODE
  • WHENEVER OSERROR EXIT

Par exemple:

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

Et pour les erreurs OS:

WHENEVER OSERROR EXIT FAILURE
START no_such_file

Pour plus d'informations, voir this et that .

J'espère que ça aide. Bonne chance!

24
user405725

Vlad est la réponse que j'utiliserais. Pour augmenter le sien, cependant, j'essaie d'utiliser une instruction EXIT explicite si j'ai vraiment besoin de ce statut de retour. Par exemple

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

exit &exitcode;
6
Andrew Wolfe

La meilleure action pourrait être une combinaison des autres idées de cette page et des idées de

Aide avec SQLPLUS s'il vous plaît? Comment faire le démarrage de SQLPLUS avec DEFINE `OFF` initialement?

Créez un fichier login.sql ou modifiez le fichier global pour

WHENEVER OSERROR EXIT FAILURE
WHENEVER SQLERROR EXIT SQL.SQLCODE

à l'intérieur. Ensuite, si le fichier n'existe pas, il affichera une erreur. Si une ligne échoue, elle sortira en erreur.

Cependant, gardez à l'esprit que, comme le disent les documents sur: https://docs.Oracle.com/cd/E11882_01/server.112/e16604/ch_twelve052.htm#SQPUG135 que certaines commandes ne fonctionneront toujours pas erreur comme vous pouvez vous y attendre.

2
Karl Henselin