web-dev-qa-db-fra.com

Gestion de la gestion des erreurs lors de l'exécution de scripts sqlplus à partir de shell

#!/bin/sh

echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name

LOGFILE=Shell_log.txt

$Oracle_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
connect $eval_user/$eval_pass@$db_name
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
DBMS_OUTPUT.put_line('Connected to db');
EOF

if [ $? != 0 ]
then 
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $?"
exit 0;
fi

J'entre des valeurs erronées en essayant de forcer ce script à échouer. Mais, ennuyeux, il continue d'avancer sans aucune mention de code d'erreur. Quoi d'autre doit être fait ici?

13
roymustang86

Ce que dit Max est correct. Essayez ce script modifié

#!/bin/sh

echo "Please enter evaluate database username"
read eval_user
echo "Please enter evaluate database password"
read eval_pass
echo "Please enter the database name"
read db_name

LOGFILE=Shell_log.txt

sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF

sql_return_code=$?

if [ $sql_return_code != 0 ]
then
echo "The upgrade script failed. Please refer to the log results.txt for more information"
echo "Error code $sql_return_code"
exit 0;
fi

Veuillez noter l'utilisation de sql_return_code pour capturer le code de retour SQLPLUS. 

L'instruction DBMS_OUTPUT doit échouer avec l'erreur suivante: "SP2-0734: commande inconnue commençant ...". Vous pouvez trouver le message d'erreur dans le fichier journal. 

Il est possible d'intercepter les erreurs sp2 dans SQLPLUS 11g à l'aide de la fonction de journalisation des erreurs. Veuillez consulter http://tkyte.blogspot.co.uk/2010/04/new-thing-about-sqlplus.html pour plus d'informations.

12
Aji Mathew

il est possible que vos déclarations soient exécutées chaque fois que la connexion à la base de données a été établie (puisque vous les avez mentionnées par la suite). Essayez le code suivant: -

$Oracle_HOME/bin/sqlplus -s /nolog <<-EOF>> ${LOGFILE}
WHENEVER OSERROR EXIT 9;
WHENEVER SQLERROR EXIT SQL.SQLCODE;
connect $eval_user/$eval_pass@$db_name
DBMS_OUTPUT.put_line('Connected to db');
EOF
5
Max

La réponse d'Aji avec 

WHENEVER SQLERROR EXIT SQL.SQLCODE;

puis en utilisant 

sql_return_code=$?

n'est pas correct (ou pas correct dans la plupart des cas). Voir les détails ci-dessous.


Un script shell dans un système d'exploitation UNIX peut renvoyer des codes allant jusqu'à 255. E.g. "ORA-12703, cette conversion de jeu de caractères n'est pas prise en charge". Le code de retour doit être 12703, mais il ne correspond pas au code de retour UNIX 8 bits.
En fait, je viens de faire un test et d’exécuter un mauvais SQL qui échoue avec "ORA-00936: expression manquante" -
sqlplus a renvoyé 168 (!).
Ainsi, le code de retour réel 936 a été emballé à 256 et seul le reste a été renvoyé. 936% 256 = 168.


Sous Windows, cela pourrait probablement fonctionner (non testé), mais pas sous UNIX (testé comme expliqué ci-dessus).


Le seul mécanisme fiable consiste probablement à spouler les résultats dans un fichier journal, puis à faire quelque chose comme:

tail -n 25 spool.log | egrep "ORA-" | tail -n 1 | cut -d: -f1 | cut -d- -f2

Ainsi, le fichier journal du spool sera grugé, puis le dernier code ORA actuel sera coupé.

3
Tagar

Le fait que vous entriez de fausses valeurs ne sont probablement liées qu’à la connexion. Ensuite: Vérifier la connectivité de la base de données à l'aide d'un script Shell

Le WHENEVER ... concerne les erreurs lors de l'exécution du script SQL. Une fois que vous aurez réussi à vous connecter avec votre script (je suppose que c'est votre problème maintenant), vous devriez obtenir le type d'erreur gérée par WHENEVER ERROR car vous avez oublié la EXEC sur votre ligne avec DBMS_OUTPUT.

1
Plouf

Vous ne pouvez intercepter que les erreurs SQL ou OS. Le paramètre dbms_output échouera au niveau de sqlplus lui-même, de sorte que le paramètre d’erreur chaque fois n’est pas affecté.

0
rajesh