En algún momento podemos tener necesidad de que se ejecute un bloque sqlplus dentro de un shell script y se lleven a cabo acciones diferentes basadas en el código de retorno. Esto no es posible si no se emplean los comandos adecuados, ya que independientemente de que los comandos ejecutados dentro de las sesión sqlplus tengan éxito o fallen, el código de retorno siempre es 0.
Podemos emplear «WHENEVER SQLERROR EXIT SQL.SQLCODE» para terminar una sesión sqlplus y devolver un código de error cuando se produce un error en un comando SQL o en un bloque PL/SQL. Del mismo modo con «WHENEVER OSERROR EXIT OSCODE» se devuelve un código de error si ocurre un error a nivel del Sistema Operativo. Estas opciones existen desde la versión Oracle 9i.
Documentación de Oracle sobre estos comandos:
WHENEVER OSERROR
http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12051.htm
WHENEVER SQLERROR
http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12052.htm
Ejemplo:
#!/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 <> ${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